From a58b115c19e73f3e3d4e6215e70e04b56c95d493 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 1 Dec 2024 12:04:00 +0100 Subject: [PATCH 01/81] Removed app --- app/.gitignore | 1 - app/build.gradle | 42 ----- app/proguard-rules.pro | 21 --- .../dotmimsync/ExampleInstrumentedTest.kt | 24 --- app/src/main/AndroidManifest.xml | 23 --- .../com/mimetis/dotmimsync/MainActivity.kt | 11 -- .../drawable-v24/ic_launcher_foreground.xml | 30 ---- .../res/drawable/ic_launcher_background.xml | 170 ------------------ app/src/main/res/layout/activity_main.xml | 18 -- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 0 bytes app/src/main/res/values-night/themes.xml | 16 -- app/src/main/res/values/colors.xml | 10 -- app/src/main/res/values/strings.xml | 3 - app/src/main/res/values/themes.xml | 16 -- .../com/mimetis/dotmimsync/ExampleUnitTest.kt | 17 -- shared/build.gradle.kts | 64 +++++++ .../mimetis/dotmimsync/Platform.android.kt | 7 + .../dotmim/sync/ArrayListLikeSerializer.kt | 0 .../com/mimetis/dotmim/sync/CoreProvider.kt | 0 .../com/mimetis/dotmim/sync/DataRowState.kt | 0 .../com/mimetis/dotmim/sync/DateSerializer.kt | 0 .../com/mimetis/dotmim/sync/DbSyncAdapter.kt | 0 .../com/mimetis/dotmim/sync/Extensions.kt | 0 .../sync/MissingClientScopeInfoException.kt | 0 .../dotmim/sync/MissingColumnException.kt | 0 .../dotmim/sync/MissingFileException.kt | 0 ...MissingLocalOrchestratorSchemaException.kt | 0 .../sync/MissingPrimaryKeyColumnException.kt | 0 .../dotmim/sync/MissingPrimaryKeyException.kt | 0 .../dotmim/sync/MissingTableException.kt | 0 .../dotmim/sync/MissingTablesException.kt | 0 .../sync/MissingTrackingTableException.kt | 0 .../dotmim/sync/MissingsColumnException.kt | 0 .../mimetis/dotmim/sync/OutOfDateException.kt | 0 .../com/mimetis/dotmim/sync/Platform.kt | 7 + .../dotmim/sync/PrimitiveSerializer.kt | 0 .../com/mimetis/dotmim/sync/Progress.kt | 0 .../mimetis/dotmim/sync/RollbackException.kt | 0 .../dotmim/sync/RowOverSizedException.kt | 0 .../com/mimetis/dotmim/sync/SyncAgent.kt | 0 .../com/mimetis/dotmim/sync/SyncConflict.kt | 0 .../com/mimetis/dotmim/sync/SyncContext.kt | 0 .../com/mimetis/dotmim/sync/SyncOptions.kt | 0 .../com/mimetis/dotmim/sync/SyncResult.kt | 0 .../mimetis/dotmim/sync/SyncTypeConverter.kt | 0 .../com/mimetis/dotmim/sync/SyncVersion.kt | 0 .../kotlin}/com/mimetis/dotmim/sync/Tuple.kt | 0 .../com/mimetis/dotmim/sync/UUIDSerializer.kt | 0 .../mimetis/dotmim/sync/UnknownException.kt | 0 .../sync/UnsupportedColumnTypeException.kt | 0 ...nsupportedPrimaryKeyColumnNameException.kt | 0 .../sync/args/ApplyChangesFailedArgs.kt | 0 .../sync/args/DatabaseChangesAppliedArgs.kt | 0 .../sync/args/DatabaseChangesSelectedArgs.kt | 0 .../sync/args/DatabaseChangesSelectingArgs.kt | 0 .../dotmim/sync/args/DeprovisionedArgs.kt | 0 .../dotmim/sync/args/DeprovisioningArgs.kt | 0 .../dotmim/sync/args/DeserializingSetArgs.kt | 0 .../sync/args/HttpBatchesDownloadedArgs.kt | 0 .../sync/args/HttpBatchesDownloadingArgs.kt | 0 .../sync/args/HttpGettingSchemaRequestArgs.kt | 0 .../args/HttpGettingSchemaResponseArgs.kt | 0 .../sync/args/HttpGettingScopeRequestArgs.kt | 0 .../HttpGettingServerChangesRequestArgs.kt | 0 .../HttpGettingServerChangesResponseArgs.kt | 0 .../HttpSendingClientChangesRequestArgs.kt | 0 .../mimetis/dotmim/sync/args/OutdatedArgs.kt | 0 .../mimetis/dotmim/sync/args/ProgressArgs.kt | 0 .../dotmim/sync/args/ProvisionedArgs.kt | 0 .../dotmim/sync/args/ProvisioningArgs.kt | 0 .../dotmim/sync/args/SchemaLoadedArgs.kt | 0 .../dotmim/sync/args/SchemaLoadingArgs.kt | 0 .../dotmim/sync/args/ScopeSavedArgs.kt | 0 .../dotmim/sync/args/ScopeSavingArgs.kt | 0 .../dotmim/sync/args/ScopeTableCreatedArgs.kt | 0 .../sync/args/ScopeTableCreatingArgs.kt | 0 .../dotmim/sync/args/SerializingSetArgs.kt | 0 .../dotmim/sync/args/SessionBeginArgs.kt | 0 .../dotmim/sync/args/SessionEndArgs.kt | 0 .../sync/args/TableChangesAppliedArgs.kt | 0 .../sync/args/TableChangesApplyingArgs.kt | 0 .../sync/args/TableChangesBatchAppliedArgs.kt | 0 .../args/TableChangesBatchApplyingArgs.kt | 0 .../sync/args/TableChangesSelectedArgs.kt | 0 .../sync/args/TableChangesSelectingArgs.kt | 0 .../mimetis/dotmim/sync/batch/BatchInfo.kt | 0 .../dotmim/sync/batch/BatchPartInfo.kt | 0 .../dotmim/sync/batch/BatchPartTableInfo.kt | 0 .../mimetis/dotmim/sync/builders/DbBuilder.kt | 0 .../dotmim/sync/builders/DbMetadata.kt | 0 .../dotmim/sync/builders/DbScopeBuilder.kt | 0 .../dotmim/sync/builders/DbScopeType.kt | 0 .../sync/builders/DbStoredProcedureType.kt | 0 .../dotmim/sync/builders/DbTableBuilder.kt | 0 .../dotmim/sync/builders/DbTriggerType.kt | 0 .../dotmim/sync/builders/GlobalParser.kt | 0 .../dotmim/sync/builders/ParserName.kt | 0 .../dotmim/sync/builders/ParserString.kt | 0 .../dotmim/sync/data/EnumByNameSerializer.kt | 0 .../dotmim/sync/data/EnumByValueSerializer.kt | 0 .../mimetis/dotmim/sync/data/EnumWithValue.kt | 0 .../dotmim/sync/enumerations/ApplyAction.kt | 0 .../sync/enumerations/ConflictResolution.kt | 0 .../enumerations/ConflictResolutionPolicy.kt | 0 .../dotmim/sync/enumerations/ConflictType.kt | 0 .../dotmim/sync/enumerations/SyncDirection.kt | 0 .../dotmim/sync/enumerations/SyncProvision.kt | 0 .../dotmim/sync/enumerations/SyncStage.kt | 0 .../dotmim/sync/enumerations/SyncType.kt | 0 .../dotmim/sync/enumerations/SyncWay.kt | 0 .../sync/interceptors/ISyncInterceptor.kt | 0 .../sync/interceptors/InterceptorWrapper.kt | 0 .../dotmim/sync/interceptors/Interceptors.kt | 0 .../manager/DbRelationColumnDefinition.kt | 0 .../sync/manager/DbRelationDefinition.kt | 0 .../sync/messages/DatabaseChangesApplied.kt | 0 .../sync/messages/DatabaseChangesSelected.kt | 0 .../sync/messages/DatabaseMetadatasCleaned.kt | 0 .../sync/messages/MessageApplyChanges.kt | 0 .../sync/messages/MessageGetChangesBatch.kt | 0 .../sync/messages/TableChangesApplied.kt | 0 .../sync/messages/TableChangesSelected.kt | 0 .../sync/messages/TableMetadatasCleaned.kt | 0 .../sync/orchestrators/BaseOrchestrator.kt | 0 .../sync/orchestrators/LocalOrchestrator.kt | 0 .../sync/orchestrators/RemoteOrchestrator.kt | 0 .../dotmim/sync/parameter/SyncParameter.kt | 0 .../dotmim/sync/parameter/SyncParameters.kt | 0 .../mimetis/dotmim/sync/scopes/ScopeInfo.kt | 0 .../dotmim/sync/scopes/ServerScopeInfo.kt | 0 .../dotmim/sync/serialization/Converter.kt | 0 .../dotmim/sync/serialization/DmUtils.kt | 0 .../mimetis/dotmim/sync/set/CompareHelper.kt | 0 .../mimetis/dotmim/sync/set/ContainerSet.kt | 0 .../mimetis/dotmim/sync/set/ContainerTable.kt | 0 .../com/mimetis/dotmim/sync/set/SyncColumn.kt | 0 .../dotmim/sync/set/SyncColumnIdentifier.kt | 0 .../mimetis/dotmim/sync/set/SyncColumns.kt | 0 .../com/mimetis/dotmim/sync/set/SyncFilter.kt | 0 .../mimetis/dotmim/sync/set/SyncFilterJoin.kt | 0 .../dotmim/sync/set/SyncFilterJoins.kt | 0 .../dotmim/sync/set/SyncFilterParameter.kt | 0 .../dotmim/sync/set/SyncFilterParameters.kt | 0 .../sync/set/SyncFilterWhereSideItem.kt | 0 .../sync/set/SyncFilterWhereSideItems.kt | 0 .../mimetis/dotmim/sync/set/SyncFilters.kt | 0 .../mimetis/dotmim/sync/set/SyncNamedItem.kt | 0 .../mimetis/dotmim/sync/set/SyncRelation.kt | 0 .../mimetis/dotmim/sync/set/SyncRelations.kt | 0 .../com/mimetis/dotmim/sync/set/SyncRow.kt | 0 .../com/mimetis/dotmim/sync/set/SyncRows.kt | 0 .../com/mimetis/dotmim/sync/set/SyncSet.kt | 0 .../com/mimetis/dotmim/sync/set/SyncTable.kt | 0 .../com/mimetis/dotmim/sync/set/SyncTables.kt | 0 .../com/mimetis/dotmim/sync/setup/DbType.kt | 0 .../com/mimetis/dotmim/sync/setup/Join.kt | 0 .../mimetis/dotmim/sync/setup/SetupColumns.kt | 0 .../mimetis/dotmim/sync/setup/SetupFilter.kt | 0 .../dotmim/sync/setup/SetupFilterJoin.kt | 0 .../dotmim/sync/setup/SetupFilterParameter.kt | 0 .../dotmim/sync/setup/SetupFilterWhere.kt | 0 .../mimetis/dotmim/sync/setup/SetupFilters.kt | 0 .../mimetis/dotmim/sync/setup/SetupTable.kt | 0 .../mimetis/dotmim/sync/setup/SetupTables.kt | 0 .../mimetis/dotmim/sync/setup/SyncSetup.kt | 0 .../dotmim/sync/sqlite/CursorHelper.kt | 0 .../dotmim/sync/sqlite/SqliteBuilder.kt | 0 .../dotmim/sync/sqlite/SqliteDbMetadata.kt | 0 .../sync/sqlite/SqliteManagementUtils.kt | 0 .../dotmim/sync/sqlite/SqliteQueryWrapper.kt | 0 .../dotmim/sync/sqlite/SqliteScopeBuilder.kt | 0 .../dotmim/sync/sqlite/SqliteSyncAdapter.kt | 0 .../dotmim/sync/sqlite/SqliteSyncProvider.kt | 0 .../dotmim/sync/sqlite/SqliteTableBuilder.kt | 0 .../mimetis/dotmim/sync/sqlite/SqliteType.kt | 0 .../sync/web/client/DotmimServiceImpl.kt | 0 .../sync/web/client/FancyCoreProvider.kt | 0 .../client/HttpMessageEnsureSchemaResponse.kt | 0 .../client/HttpMessageEnsureScopesRequest.kt | 0 .../client/HttpMessageEnsureScopesResponse.kt | 0 .../HttpMessageGetMoreChangesRequest.kt | 0 .../client/HttpMessageSendChangesRequest.kt | 0 .../client/HttpMessageSendChangesResponse.kt | 0 .../web/client/HttpMessageSummaryResponse.kt | 0 .../dotmim/sync/web/client/HttpStep.kt | 0 .../sync/web/client/WebClientOrchestrator.kt | 0 .../com/mimetis/dotmimsync/Platform.ios.kt | 9 + 198 files changed, 87 insertions(+), 412 deletions(-) delete mode 100644 app/.gitignore delete mode 100644 app/build.gradle delete mode 100644 app/proguard-rules.pro delete mode 100644 app/src/androidTest/java/com/mimetis/dotmimsync/ExampleInstrumentedTest.kt delete mode 100644 app/src/main/AndroidManifest.xml delete mode 100644 app/src/main/java/com/mimetis/dotmimsync/MainActivity.kt delete mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/values-night/themes.xml delete mode 100644 app/src/main/res/values/colors.xml delete mode 100644 app/src/main/res/values/strings.xml delete mode 100644 app/src/main/res/values/themes.xml delete mode 100644 app/src/test/java/com/mimetis/dotmimsync/ExampleUnitTest.kt create mode 100644 shared/build.gradle.kts create mode 100644 shared/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/ArrayListLikeSerializer.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/CoreProvider.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/DataRowState.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/DateSerializer.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/DbSyncAdapter.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/Extensions.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/MissingClientScopeInfoException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/MissingColumnException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/MissingFileException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/MissingLocalOrchestratorSchemaException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/MissingPrimaryKeyColumnException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/MissingPrimaryKeyException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/MissingTableException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/MissingTablesException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/MissingTrackingTableException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/MissingsColumnException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/OutOfDateException.kt (100%) create mode 100644 shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/PrimitiveSerializer.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/Progress.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/RollbackException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/RowOverSizedException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/SyncAgent.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/SyncConflict.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/SyncContext.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/SyncOptions.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/SyncResult.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/SyncTypeConverter.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/SyncVersion.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/Tuple.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/UUIDSerializer.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/UnknownException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/UnsupportedColumnTypeException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/UnsupportedPrimaryKeyColumnNameException.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/DatabaseChangesAppliedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/DatabaseChangesSelectedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/DatabaseChangesSelectingArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/DeprovisionedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/DeprovisioningArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/HttpBatchesDownloadedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/HttpBatchesDownloadingArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/HttpGettingSchemaRequestArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/HttpGettingSchemaResponseArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/HttpGettingScopeRequestArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/HttpGettingServerChangesRequestArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/HttpGettingServerChangesResponseArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/HttpSendingClientChangesRequestArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/OutdatedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/ProgressArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/ProvisionedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/SchemaLoadedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/SchemaLoadingArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/ScopeSavedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/ScopeSavingArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/ScopeTableCreatedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/ScopeTableCreatingArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/SerializingSetArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/SessionBeginArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/SessionEndArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/TableChangesAppliedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/TableChangesApplyingArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/TableChangesBatchAppliedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/TableChangesBatchApplyingArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/TableChangesSelectedArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/args/TableChangesSelectingArgs.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/batch/BatchInfo.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/batch/BatchPartTableInfo.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/builders/DbBuilder.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/builders/DbMetadata.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/builders/DbScopeType.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/builders/DbStoredProcedureType.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/builders/DbTableBuilder.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/builders/DbTriggerType.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/builders/GlobalParser.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/builders/ParserName.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/builders/ParserString.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/data/EnumByNameSerializer.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/data/EnumByValueSerializer.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/data/EnumWithValue.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/enumerations/ApplyAction.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/enumerations/ConflictResolution.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/enumerations/ConflictResolutionPolicy.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/enumerations/ConflictType.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/enumerations/SyncDirection.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/enumerations/SyncProvision.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/enumerations/SyncStage.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/enumerations/SyncType.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/enumerations/SyncWay.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/interceptors/ISyncInterceptor.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/interceptors/InterceptorWrapper.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/interceptors/Interceptors.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/manager/DbRelationColumnDefinition.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/manager/DbRelationDefinition.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/messages/DatabaseChangesApplied.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/messages/DatabaseChangesSelected.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/messages/DatabaseMetadatasCleaned.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/messages/TableChangesApplied.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/messages/TableChangesSelected.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/messages/TableMetadatasCleaned.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/orchestrators/RemoteOrchestrator.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/parameter/SyncParameter.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/parameter/SyncParameters.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/scopes/ServerScopeInfo.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/serialization/Converter.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/serialization/DmUtils.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/CompareHelper.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/ContainerSet.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/ContainerTable.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncColumn.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncColumnIdentifier.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncColumns.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncFilter.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncFilterJoin.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncFilterJoins.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncFilterParameter.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncFilterParameters.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItem.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItems.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncFilters.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncNamedItem.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncRelation.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncRelations.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncRow.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncRows.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncSet.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncTable.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/set/SyncTables.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/setup/DbType.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/setup/Join.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/setup/SetupColumns.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/setup/SetupFilter.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/setup/SetupFilterJoin.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/setup/SetupFilterParameter.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/setup/SetupFilterWhere.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/setup/SetupFilters.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/setup/SetupTable.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/setup/SetupTables.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/setup/SyncSetup.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/sqlite/SqliteBuilder.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/sqlite/SqliteDbMetadata.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/sqlite/SqliteManagementUtils.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/sqlite/SqliteSyncProvider.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/sqlite/SqliteType.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/web/client/FancyCoreProvider.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureSchemaResponse.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesRequest.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesResponse.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/web/client/HttpMessageGetMoreChangesRequest.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesRequest.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesResponse.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/web/client/HttpMessageSummaryResponse.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/web/client/HttpStep.kt (100%) rename {dotmimsync/src/main/java => shared/src/commonMain/kotlin}/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt (100%) create mode 100644 shared/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 860a5c4..0000000 --- a/app/build.gradle +++ /dev/null @@ -1,42 +0,0 @@ -plugins { - id 'com.android.application' - id 'kotlin-android' -} - -android { - compileSdk rootProject.ext.compileSdk - buildToolsVersion rootProject.ext.buildToolsVersion - - defaultConfig { - applicationId "com.mimetis.dotmimsync" - minSdk rootProject.ext.minSdk - targetSdk rootProject.ext.targetSdk - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } -} - -dependencies { - - implementation 'androidx.core:core-ktx:1.7.0' - implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'com.google.android.material:material:1.4.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.1' - testImplementation 'junit:junit:4.+' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' -} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/mimetis/dotmimsync/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/mimetis/dotmimsync/ExampleInstrumentedTest.kt deleted file mode 100644 index 77914fd..0000000 --- a/app/src/androidTest/java/com/mimetis/dotmimsync/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.mimetis.dotmimsync - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.mimetis.dotmimsync", appContext.packageName) - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml deleted file mode 100644 index e44222f..0000000 --- a/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/mimetis/dotmimsync/MainActivity.kt b/app/src/main/java/com/mimetis/dotmimsync/MainActivity.kt deleted file mode 100644 index 137740b..0000000 --- a/app/src/main/java/com/mimetis/dotmimsync/MainActivity.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.mimetis.dotmimsync - -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle - -class MainActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 4fc2444..0000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78ecd372343283f4157dcfd918ec5165bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2898 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d64e58ba64d180ce43ee13bf9a17835fbca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a3070fe34c611c42c0d3ad3013a0dce358be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml deleted file mode 100644 index 93ece03..0000000 --- a/app/src/main/res/values-night/themes.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml deleted file mode 100644 index f8c6127..0000000 --- a/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml deleted file mode 100644 index d2974f1..0000000 --- a/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - dotmimsync - \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml deleted file mode 100644 index 9ed01fd..0000000 --- a/app/src/main/res/values/themes.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/test/java/com/mimetis/dotmimsync/ExampleUnitTest.kt b/app/src/test/java/com/mimetis/dotmimsync/ExampleUnitTest.kt deleted file mode 100644 index 94e406f..0000000 --- a/app/src/test/java/com/mimetis/dotmimsync/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.mimetis.dotmimsync - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts new file mode 100644 index 0000000..5575ac9 --- /dev/null +++ b/shared/build.gradle.kts @@ -0,0 +1,64 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.androidLibrary) + alias(libs.plugins.jetbrains.kotlin.serialization) +} + +kotlin { + androidTarget { + compilations.all { + compileTaskProvider.configure { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_1_8) + } + } + } + } + +// listOf( +// iosX64(), +// iosArm64(), +// iosSimulatorArm64() +// ).forEach { +// it.binaries.framework { +// baseName = "shared" +// isStatic = true +// } +// } + + sourceSets { + commonMain.dependencies { + implementation(libs.jetbrains.serialization.core) + implementation(libs.jetbrains.serialization.json) +// implementation(libs.jetbrains.serialization.core.jvm) + implementation(libs.kotlinx.datetime) + implementation(libs.kotlinx.uuid) + implementation(libs.androidx.sqlite.bundled) + + implementation(libs.bundles.ktor) + } + androidMain.dependencies { + implementation(libs.ktor.client.okhttp) + } + iosMain.dependencies { + implementation(libs.ktor.client.darwin) + } + commonTest.dependencies { + implementation(libs.kotlin.test) + } + } +} + +android { + namespace = "com.mimetis.dotmimsync" + compileSdk = 34 + defaultConfig { + minSdk = 26 + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} diff --git a/shared/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt b/shared/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt new file mode 100644 index 0000000..2638faf --- /dev/null +++ b/shared/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt @@ -0,0 +1,7 @@ +package com.mimetis.dotmimsync + +class AndroidPlatform : Platform { + override val name: String = "Android ${android.os.Build.VERSION.SDK_INT}" +} + +actual fun getPlatform(): Platform = AndroidPlatform() \ No newline at end of file diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/ArrayListLikeSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/ArrayListLikeSerializer.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/ArrayListLikeSerializer.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/ArrayListLikeSerializer.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/CoreProvider.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/CoreProvider.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/CoreProvider.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/CoreProvider.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/DataRowState.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DataRowState.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/DataRowState.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DataRowState.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/DateSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/DateSerializer.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/DbSyncAdapter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/DbSyncAdapter.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/Extensions.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/Extensions.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingClientScopeInfoException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingClientScopeInfoException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingClientScopeInfoException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingClientScopeInfoException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingColumnException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingColumnException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingColumnException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingColumnException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingFileException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingFileException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingFileException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingFileException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingLocalOrchestratorSchemaException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingLocalOrchestratorSchemaException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingLocalOrchestratorSchemaException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingLocalOrchestratorSchemaException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingPrimaryKeyColumnException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingPrimaryKeyColumnException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingPrimaryKeyColumnException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingPrimaryKeyColumnException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingPrimaryKeyException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingPrimaryKeyException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingPrimaryKeyException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingPrimaryKeyException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingTableException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTableException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingTableException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTableException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingTablesException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTablesException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingTablesException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTablesException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingTrackingTableException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTrackingTableException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingTrackingTableException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTrackingTableException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingsColumnException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingsColumnException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/MissingsColumnException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingsColumnException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/OutOfDateException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/OutOfDateException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/OutOfDateException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/OutOfDateException.kt diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt new file mode 100644 index 0000000..1957748 --- /dev/null +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt @@ -0,0 +1,7 @@ +package com.mimetis.dotmimsync + +interface Platform { + val name: String +} + +expect fun getPlatform(): Platform \ No newline at end of file diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/PrimitiveSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/PrimitiveSerializer.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/Progress.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/Progress.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/Progress.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/Progress.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/RollbackException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/RollbackException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/RollbackException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/RollbackException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/RowOverSizedException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/RowOverSizedException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/RowOverSizedException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/RowOverSizedException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncAgent.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncAgent.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncConflict.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncConflict.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncConflict.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncConflict.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncContext.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncContext.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncOptions.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncOptions.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncOptions.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncOptions.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncResult.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncResult.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncTypeConverter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncTypeConverter.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncVersion.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncVersion.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/SyncVersion.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncVersion.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/Tuple.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/Tuple.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/Tuple.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/Tuple.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/UUIDSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/UUIDSerializer.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/UnknownException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UnknownException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/UnknownException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UnknownException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/UnsupportedColumnTypeException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UnsupportedColumnTypeException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/UnsupportedColumnTypeException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UnsupportedColumnTypeException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/UnsupportedPrimaryKeyColumnNameException.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UnsupportedPrimaryKeyColumnNameException.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/UnsupportedPrimaryKeyColumnNameException.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UnsupportedPrimaryKeyColumnNameException.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DatabaseChangesAppliedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DatabaseChangesAppliedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DatabaseChangesAppliedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DatabaseChangesAppliedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DatabaseChangesSelectedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DatabaseChangesSelectedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DatabaseChangesSelectedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DatabaseChangesSelectedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DatabaseChangesSelectingArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DatabaseChangesSelectingArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DatabaseChangesSelectingArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DatabaseChangesSelectingArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DeprovisionedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisionedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DeprovisionedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisionedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DeprovisioningArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisioningArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DeprovisioningArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisioningArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpBatchesDownloadedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpBatchesDownloadedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpBatchesDownloadedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpBatchesDownloadedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpBatchesDownloadingArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpBatchesDownloadingArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpBatchesDownloadingArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpBatchesDownloadingArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpGettingSchemaRequestArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingSchemaRequestArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpGettingSchemaRequestArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingSchemaRequestArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpGettingSchemaResponseArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingSchemaResponseArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpGettingSchemaResponseArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingSchemaResponseArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpGettingScopeRequestArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingScopeRequestArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpGettingScopeRequestArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingScopeRequestArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpGettingServerChangesRequestArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingServerChangesRequestArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpGettingServerChangesRequestArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingServerChangesRequestArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpGettingServerChangesResponseArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingServerChangesResponseArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpGettingServerChangesResponseArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingServerChangesResponseArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpSendingClientChangesRequestArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpSendingClientChangesRequestArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/HttpSendingClientChangesRequestArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpSendingClientChangesRequestArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/OutdatedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/OutdatedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/OutdatedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/OutdatedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ProgressArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProgressArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ProgressArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProgressArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ProvisionedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisionedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ProvisionedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisionedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/SchemaLoadedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SchemaLoadedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/SchemaLoadedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SchemaLoadedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/SchemaLoadingArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SchemaLoadingArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/SchemaLoadingArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SchemaLoadingArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ScopeSavedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeSavedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ScopeSavedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeSavedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ScopeSavingArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeSavingArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ScopeSavingArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeSavingArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ScopeTableCreatedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeTableCreatedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ScopeTableCreatedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeTableCreatedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ScopeTableCreatingArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeTableCreatingArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/ScopeTableCreatingArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeTableCreatingArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/SerializingSetArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SerializingSetArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/SerializingSetArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SerializingSetArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/SessionBeginArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionBeginArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/SessionBeginArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionBeginArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/SessionEndArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionEndArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/SessionEndArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionEndArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesAppliedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesAppliedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesAppliedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesAppliedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesApplyingArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesApplyingArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesApplyingArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesApplyingArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesBatchAppliedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesBatchAppliedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesBatchAppliedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesBatchAppliedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesBatchApplyingArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesBatchApplyingArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesBatchApplyingArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesBatchApplyingArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesSelectedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesSelectedArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesSelectedArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesSelectedArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesSelectingArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesSelectingArgs.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/args/TableChangesSelectingArgs.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesSelectingArgs.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/batch/BatchInfo.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/batch/BatchInfo.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/batch/BatchPartTableInfo.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartTableInfo.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/batch/BatchPartTableInfo.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartTableInfo.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbBuilder.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbBuilder.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbBuilder.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbBuilder.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbMetadata.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbMetadata.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbMetadata.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbMetadata.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbScopeType.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeType.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbScopeType.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeType.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbStoredProcedureType.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbStoredProcedureType.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbStoredProcedureType.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbStoredProcedureType.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbTableBuilder.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbTableBuilder.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbTableBuilder.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbTableBuilder.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbTriggerType.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbTriggerType.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/DbTriggerType.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbTriggerType.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/GlobalParser.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/GlobalParser.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/GlobalParser.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/GlobalParser.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/ParserName.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/ParserName.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/ParserName.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/ParserName.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/ParserString.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/ParserString.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/builders/ParserString.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/ParserString.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/data/EnumByNameSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByNameSerializer.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/data/EnumByNameSerializer.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByNameSerializer.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/data/EnumByValueSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByValueSerializer.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/data/EnumByValueSerializer.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByValueSerializer.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/data/EnumWithValue.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumWithValue.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/data/EnumWithValue.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumWithValue.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/ApplyAction.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ApplyAction.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/ApplyAction.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ApplyAction.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/ConflictResolution.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ConflictResolution.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/ConflictResolution.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ConflictResolution.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/ConflictResolutionPolicy.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ConflictResolutionPolicy.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/ConflictResolutionPolicy.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ConflictResolutionPolicy.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/ConflictType.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ConflictType.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/ConflictType.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ConflictType.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/SyncDirection.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncDirection.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/SyncDirection.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncDirection.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/SyncProvision.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncProvision.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/SyncProvision.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncProvision.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/SyncStage.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncStage.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/SyncStage.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncStage.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/SyncType.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncType.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/SyncType.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncType.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/SyncWay.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncWay.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/enumerations/SyncWay.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncWay.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/interceptors/ISyncInterceptor.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/ISyncInterceptor.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/interceptors/ISyncInterceptor.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/ISyncInterceptor.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/interceptors/InterceptorWrapper.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/InterceptorWrapper.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/interceptors/InterceptorWrapper.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/InterceptorWrapper.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/interceptors/Interceptors.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/Interceptors.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/interceptors/Interceptors.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/Interceptors.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/manager/DbRelationColumnDefinition.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/manager/DbRelationColumnDefinition.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/manager/DbRelationColumnDefinition.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/manager/DbRelationColumnDefinition.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/manager/DbRelationDefinition.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/manager/DbRelationDefinition.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/manager/DbRelationDefinition.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/manager/DbRelationDefinition.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/DatabaseChangesApplied.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/DatabaseChangesApplied.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/DatabaseChangesApplied.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/DatabaseChangesApplied.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/DatabaseChangesSelected.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/DatabaseChangesSelected.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/DatabaseChangesSelected.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/DatabaseChangesSelected.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/DatabaseMetadatasCleaned.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/DatabaseMetadatasCleaned.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/DatabaseMetadatasCleaned.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/DatabaseMetadatasCleaned.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/TableChangesApplied.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/TableChangesApplied.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/TableChangesApplied.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/TableChangesApplied.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/TableChangesSelected.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/TableChangesSelected.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/TableChangesSelected.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/TableChangesSelected.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/TableMetadatasCleaned.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/TableMetadatasCleaned.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/messages/TableMetadatasCleaned.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/TableMetadatasCleaned.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/orchestrators/RemoteOrchestrator.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/RemoteOrchestrator.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/orchestrators/RemoteOrchestrator.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/RemoteOrchestrator.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/parameter/SyncParameter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameter.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/parameter/SyncParameter.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameter.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/parameter/SyncParameters.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameters.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/parameter/SyncParameters.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameters.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/scopes/ServerScopeInfo.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ServerScopeInfo.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/scopes/ServerScopeInfo.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ServerScopeInfo.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/serialization/Converter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/Converter.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/serialization/Converter.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/Converter.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/serialization/DmUtils.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/serialization/DmUtils.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/CompareHelper.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/CompareHelper.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/CompareHelper.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/CompareHelper.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/ContainerSet.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerSet.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/ContainerSet.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerSet.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/ContainerTable.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/ContainerTable.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncColumn.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncColumn.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncColumnIdentifier.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumnIdentifier.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncColumnIdentifier.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumnIdentifier.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncColumns.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumns.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncColumns.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumns.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilter.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilter.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilter.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterJoin.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoin.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterJoin.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoin.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterJoins.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoins.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterJoins.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoins.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterParameter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameter.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterParameter.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameter.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterParameters.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameters.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterParameters.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameters.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItem.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItem.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItem.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItem.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItems.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItems.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItems.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItems.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilters.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilters.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncFilters.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilters.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncNamedItem.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncNamedItem.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncNamedItem.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncNamedItem.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncRelation.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRelation.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncRelation.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRelation.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncRelations.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRelations.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncRelations.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRelations.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncRow.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncRow.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncRows.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRows.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncRows.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRows.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncSet.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncSet.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncSet.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncSet.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncTable.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncTable.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncTable.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncTable.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncTables.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncTables.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/set/SyncTables.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncTables.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/DbType.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/DbType.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/DbType.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/DbType.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/Join.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/Join.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/Join.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/Join.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupColumns.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupColumns.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupColumns.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupColumns.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupFilter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilter.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupFilter.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilter.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupFilterJoin.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilterJoin.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupFilterJoin.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilterJoin.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupFilterParameter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilterParameter.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupFilterParameter.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilterParameter.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupFilterWhere.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilterWhere.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupFilterWhere.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilterWhere.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupFilters.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilters.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupFilters.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilters.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupTable.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupTable.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupTable.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupTable.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupTables.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupTables.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SetupTables.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupTables.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SyncSetup.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SyncSetup.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/setup/SyncSetup.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SyncSetup.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteBuilder.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteBuilder.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteBuilder.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteBuilder.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteDbMetadata.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteDbMetadata.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteDbMetadata.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteDbMetadata.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteManagementUtils.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteManagementUtils.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteManagementUtils.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteManagementUtils.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteSyncProvider.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncProvider.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteSyncProvider.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncProvider.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteType.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteType.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/sqlite/SqliteType.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteType.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/FancyCoreProvider.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/FancyCoreProvider.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/FancyCoreProvider.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/FancyCoreProvider.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureSchemaResponse.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureSchemaResponse.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureSchemaResponse.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureSchemaResponse.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesRequest.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesRequest.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesRequest.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesRequest.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesResponse.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesResponse.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesResponse.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesResponse.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageGetMoreChangesRequest.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageGetMoreChangesRequest.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageGetMoreChangesRequest.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageGetMoreChangesRequest.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesRequest.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesRequest.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesRequest.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesRequest.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesResponse.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesResponse.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesResponse.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesResponse.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageSummaryResponse.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSummaryResponse.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpMessageSummaryResponse.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSummaryResponse.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpStep.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpStep.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/HttpStep.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpStep.kt diff --git a/dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt similarity index 100% rename from dotmimsync/src/main/java/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt diff --git a/shared/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt b/shared/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt new file mode 100644 index 0000000..2e2b511 --- /dev/null +++ b/shared/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt @@ -0,0 +1,9 @@ +package com.mimetis.dotmimsync + +import platform.UIKit.UIDevice + +class IOSPlatform: Platform { + override val name: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion +} + +actual fun getPlatform(): Platform = IOSPlatform() \ No newline at end of file From 22fb50f49ef18e65598ca29abda3f1f51cd80115 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 1 Dec 2024 12:04:20 +0100 Subject: [PATCH 02/81] Moving sources --- dotmimsync/.gitignore | 1 - dotmimsync/build.gradle | 74 -------- dotmimsync/consumer-rules.pro | 0 dotmimsync/proguard-rules.pro | 21 --- .../dotmimsync/ExampleInstrumentedTest.kt | 24 --- dotmimsync/src/main/AndroidManifest.xml | 5 - .../com/mimetis/dotmimsync/ExampleUnitTest.kt | 17 -- .../dotmimsync/PrimitiveSerializerUnitTest.kt | 176 ------------------ 8 files changed, 318 deletions(-) delete mode 100644 dotmimsync/.gitignore delete mode 100644 dotmimsync/build.gradle delete mode 100644 dotmimsync/consumer-rules.pro delete mode 100644 dotmimsync/proguard-rules.pro delete mode 100644 dotmimsync/src/androidTest/java/com/mimetis/dotmimsync/ExampleInstrumentedTest.kt delete mode 100644 dotmimsync/src/main/AndroidManifest.xml delete mode 100644 dotmimsync/src/test/java/com/mimetis/dotmimsync/ExampleUnitTest.kt delete mode 100644 dotmimsync/src/test/java/com/mimetis/dotmimsync/PrimitiveSerializerUnitTest.kt diff --git a/dotmimsync/.gitignore b/dotmimsync/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/dotmimsync/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/dotmimsync/build.gradle b/dotmimsync/build.gradle deleted file mode 100644 index ee5b18c..0000000 --- a/dotmimsync/build.gradle +++ /dev/null @@ -1,74 +0,0 @@ -plugins { - id 'com.android.library' - id 'kotlin-android' - id 'kotlinx-serialization' - id 'maven-publish' -} - -group = 'com.github.vunder' - -android { - compileSdk rootProject.ext.compileSdk - buildToolsVersion rootProject.ext.buildToolsVersion - - defaultConfig { - minSdk rootProject.ext.minSdk - targetSdk rootProject.ext.targetSdk - versionCode 6 - versionName rootProject.ext.libraryVersion - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8.toString() - useIR = true - } -} - -dependencies { - implementation 'androidx.core:core-ktx:1.7.0' - // Serialization - implementation 'org.jetbrains.kotlinx:kotlinx-serialization-core:1.3.1' - implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.1' - implementation 'org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.3.1' - // Retrofit - implementation 'com.squareup.retrofit2:retrofit:2.9.0' - implementation 'com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0' - implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.2' - implementation 'com.squareup.okhttp3:okhttp-urlconnection:5.0.0-alpha.2' - implementation 'ru.gildor.coroutines:kotlin-coroutines-okhttp:1.0' - - testImplementation 'junit:junit:4.13.2' - testImplementation 'org.powermock:powermock-module-junit4:2.0.9' - testImplementation 'org.powermock:powermock-api-mockito2:2.0.9' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' -} - -publishing { - publications { - library(MavenPublication) { - groupId "com.github.vunder"//packageName - artifactId "dotmimsync"//project.getName() - version = rootProject.ext.libraryVersion - artifact("$buildDir/outputs/aar/${project.getName()}-release.aar") - - println "publishing: " + groupId - println "publishing: " + artifactId - println "publishing: " + version - } - } -} diff --git a/dotmimsync/consumer-rules.pro b/dotmimsync/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/dotmimsync/proguard-rules.pro b/dotmimsync/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/dotmimsync/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/dotmimsync/src/androidTest/java/com/mimetis/dotmimsync/ExampleInstrumentedTest.kt b/dotmimsync/src/androidTest/java/com/mimetis/dotmimsync/ExampleInstrumentedTest.kt deleted file mode 100644 index 1754307..0000000 --- a/dotmimsync/src/androidTest/java/com/mimetis/dotmimsync/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.mimetis.dotmimsync - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.mimetis.dotmimsync.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/dotmimsync/src/main/AndroidManifest.xml b/dotmimsync/src/main/AndroidManifest.xml deleted file mode 100644 index 48239b4..0000000 --- a/dotmimsync/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/dotmimsync/src/test/java/com/mimetis/dotmimsync/ExampleUnitTest.kt b/dotmimsync/src/test/java/com/mimetis/dotmimsync/ExampleUnitTest.kt deleted file mode 100644 index 94e406f..0000000 --- a/dotmimsync/src/test/java/com/mimetis/dotmimsync/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.mimetis.dotmimsync - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/dotmimsync/src/test/java/com/mimetis/dotmimsync/PrimitiveSerializerUnitTest.kt b/dotmimsync/src/test/java/com/mimetis/dotmimsync/PrimitiveSerializerUnitTest.kt deleted file mode 100644 index 935d173..0000000 --- a/dotmimsync/src/test/java/com/mimetis/dotmimsync/PrimitiveSerializerUnitTest.kt +++ /dev/null @@ -1,176 +0,0 @@ -package com.mimetis.dotmimsync - -import android.util.Base64 -import com.mimetis.dotmim.sync.PrimitiveSerializer -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonDecoder -import kotlinx.serialization.json.encodeToJsonElement -import org.junit.Assert -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.ArgumentMatchers -import org.mockito.Mockito -import org.powermock.api.mockito.PowerMockito -import org.powermock.core.classloader.annotations.PrepareForTest -import org.powermock.modules.junit4.PowerMockRunner -import java.util.* - -@RunWith(PowerMockRunner::class) -@PrepareForTest(Base64::class) -class PrimitiveSerializerUnitTest { - @Test - fun `should return String for base64`() { - val data = arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).toByteArray() - val input = "AQIDBAUGBwgJCg==" - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement(input) - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - PowerMockito.mockStatic(Base64::class.java) - Mockito.`when`(Base64.decode(ArgumentMatchers.anyString(), ArgumentMatchers.anyInt())).thenReturn(data) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is String) - Assert.assertEquals(input, result) - } - - @Test - fun `should return String for guid`() { - val uuid = UUID.randomUUID() - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement(uuid.toString().lowercase()) - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is String) - Assert.assertEquals(uuid.toString(), result) - } - - @Test - fun `should return Boolean=true`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement(true) - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is Boolean) - Assert.assertTrue(result as Boolean) - } - - @Test - fun `should return Boolean=false`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement(false) - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is Boolean) - Assert.assertFalse(result as Boolean) - } - - @Test - fun `should return Int`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement(14) - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is Int) - Assert.assertEquals(14, result) - } - - @Test - fun `should return Int for small Long`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement(500L) - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is Int) - Assert.assertEquals(500, result) - } - - @Test - fun `should return Long`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement(Int.MAX_VALUE.toLong() + 1L) - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is Long) - Assert.assertEquals(Int.MAX_VALUE.toLong() + 1L, result) - } - - @Test - fun `should return Double`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement(2.6) - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is Double) - Assert.assertEquals(2.6, result) - } - - @Test - fun `should return Double for Float`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement(1.79f) - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is Double) - Assert.assertEquals(1.79, result) - } - - @Test - fun `should return String`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement("Foo") - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is String) - Assert.assertEquals("Foo", result) - } - - @Test - fun `should return String for multiline (n) text starts with number`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement("123\nfff") - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is String) - } - - @Test - fun `should return String for multiline (r) text starts with number1`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement("123\rfff") - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is String) - } - - @Test - fun `should return String for multiline (rn) text starts with number`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement("123\r\nfff") - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is String) - } - - @Test - fun `should return String for text starts with the number`() { - val decoderMock = Mockito.mock(JsonDecoder::class.java) - val element = Json.encodeToJsonElement("98751 км") - Mockito.`when`(decoderMock.decodeJsonElement()).thenReturn(element) - - val result = PrimitiveSerializer.deserialize(decoderMock) - Assert.assertTrue(result is String) - } -} \ No newline at end of file From 2d9ba1e1272472b4fe59d4c6a806486e333378b4 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 1 Dec 2024 12:04:37 +0100 Subject: [PATCH 03/81] KMP project files --- .gitignore | 14 +++---- build.gradle | 36 ------------------ build.gradle.kts | 5 +++ gradle.properties | 30 +++++---------- gradle/libs.versions.toml | 48 ++++++++++++++++++++++++ gradle/wrapper/gradle-wrapper.properties | 6 +-- gradlew | 0 settings.gradle | 11 ------ settings.gradle.kts | 19 ++++++++++ 9 files changed, 90 insertions(+), 79 deletions(-) delete mode 100644 build.gradle create mode 100644 build.gradle.kts create mode 100644 gradle/libs.versions.toml mode change 100644 => 100755 gradlew delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore index aa724b7..9872784 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,11 @@ *.iml .gradle -/local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +.idea .DS_Store -/build -/captures +build +captures .externalNativeBuild .cxx local.properties +xcuserdata +.kotlin \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 1d5ac1c..0000000 --- a/build.gradle +++ /dev/null @@ -1,36 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. -buildscript { - ext { - buildToolsVersion = "30.0.3" - compileSdk = 31 - minSdk = 21 - targetSdk = 31 - libraryVersion = "1.0.10" - } - repositories { - google() - mavenCentral() - maven { url "https://jitpack.io" } - } - dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0" - classpath "org.jetbrains.kotlin:kotlin-serialization:1.6.0" - classpath "com.github.dcendents:android-maven-gradle-plugin:2.1" - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - google() - mavenCentral() - maven { url "https://jitpack.io" } - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..12d80f7 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,5 @@ +plugins { + //trick: for the same plugin versions in all sub-modules + alias(libs.plugins.androidLibrary).apply(false) + alias(libs.plugins.kotlinMultiplatform).apply(false) +} diff --git a/gradle.properties b/gradle.properties index 98bed16..7f53ad4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,21 +1,11 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app"s APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn +#Gradle +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options\="-Xmx2048M" +org.gradle.caching=true +org.gradle.configuration-cache=true + +#Kotlin +kotlin.code.style=official + +#Android android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true -# Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official \ No newline at end of file +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..988face --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,48 @@ +[versions] +agp = "8.7.2" +kotlin = "2.0.20" +serialization = "1.7.3" +kotlinx-datetime = "0.6.1" +benasher44-uuid = "0.8.4" +sqlite = "2.5.0-alpha11" +ktor = "2.3.12" + +[libraries] +kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } + +jetbrains-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "serialization" } +jetbrains-serialization-core-jvm = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm", version.ref = "serialization" } +jetbrains-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" } + +kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" } +kotlinx-uuid = { module = "com.benasher44:uuid", version.ref = "benasher44-uuid" } + +#androidx-sqlite = { module = "androidx.sqlite:sqlite", version.ref = "sqlite" } +#androidx-sqlite-ktx = { module = "androidx.sqlite:sqlite-ktx", version.ref = "sqlite" } +androidx-sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" } + +ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } +ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } +ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" } +ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } +ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" } +ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } +ktor-client-auth = { module = "io.ktor:ktor-client-auth", version.ref = "ktor" } + +[plugins] +androidLibrary = { id = "com.android.library", version.ref = "agp" } +kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +kotlinCocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +jetbrains-kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } +jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } + +[bundles] +ktor = [ + "ktor-client-core", + "ktor-client-content-negotiation", + "ktor-client-auth", + "ktor-client-logging", + "ktor-serialization-kotlinx-json", +] \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index de86aa6..5a50784 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Nov 05 21:57:27 CET 2021 +#Sun Dec 01 10:12:16 CET 2024 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index cb4744f..0000000 --- a/settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -//dependencyResolutionManagement { -// repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) -// repositories { -// google() -// mavenCentral() -// jcenter() // Warning: this repository is going to shut down soon -// } -//} -//rootProject.name = "dotmimsync" -include ':app' -include ':dotmimsync' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..70d536a --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,19 @@ +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") +pluginManagement { + repositories { + google() + gradlePluginPortal() + mavenCentral() + maven(url = "https://jitpack.io") + } +} + +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "dotmimsync" +include(":shared") \ No newline at end of file From 96c2cfa7531ba83c7f266990c551c3a09d8dea04 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 1 Dec 2024 12:06:39 +0100 Subject: [PATCH 04/81] Codi compatible with KMP/Android --- .../com/mimetis/dotmim/sync/DateSerializer.kt | 31 +- .../com/mimetis/dotmim/sync/DbSyncAdapter.kt | 10 +- .../dotmim/sync/PrimitiveSerializer.kt | 21 +- .../com/mimetis/dotmim/sync/SyncAgent.kt | 3 +- .../com/mimetis/dotmim/sync/SyncContext.kt | 5 +- .../com/mimetis/dotmim/sync/UUIDSerializer.kt | 12 +- .../sync/orchestrators/LocalOrchestrator.kt | 5 +- .../mimetis/dotmim/sync/set/ContainerTable.kt | 5 +- .../com/mimetis/dotmim/sync/set/SyncSet.kt | 2 +- .../dotmim/sync/sqlite/CursorHelper.kt | 12 +- .../dotmim/sync/sqlite/SqliteScopeBuilder.kt | 11 +- .../sync/web/client/DotmimServiceImpl.kt | 360 +++++------------- .../sync/web/client/WebClientOrchestrator.kt | 8 +- 13 files changed, 159 insertions(+), 326 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt index 34a16c2..2034fe0 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt @@ -1,33 +1,24 @@ package com.mimetis.dotmim.sync -import android.annotation.SuppressLint -import android.os.Build +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.format +import kotlinx.datetime.format.byUnicodePattern import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder -import java.text.SimpleDateFormat -import java.util.* -object DateSerializer : KSerializer { +internal object DateSerializer : KSerializer { private val dateFormat = - // SDK 24 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSX" - else - "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZZZZZ" + LocalDateTime.Format { byUnicodePattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSX") } - private val gmtTimeZone = TimeZone.getTimeZone("GMT") + override val descriptor = + PrimitiveSerialDescriptor("com.mimetis.dotmim.sync.LocalDateTime", PrimitiveKind.STRING) - @SuppressLint("SimpleDateFormat") - private val simpleDateFormat = SimpleDateFormat(dateFormat).apply { timeZone = gmtTimeZone } + override fun deserialize(decoder: Decoder): LocalDateTime = + LocalDateTime.parse(decoder.decodeString(), dateFormat) - override val descriptor = PrimitiveSerialDescriptor("Date", PrimitiveKind.STRING) - - override fun deserialize(decoder: Decoder): Date = - simpleDateFormat.parse(decoder.decodeString())!! - - override fun serialize(encoder: Encoder, value: Date) = - encoder.encodeString(simpleDateFormat.format(value)) + override fun serialize(encoder: Encoder, value: LocalDateTime) = + encoder.encodeString(value.format(dateFormat)) } diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt index 75beb71..4bb1430 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt @@ -1,12 +1,12 @@ package com.mimetis.dotmim.sync import android.database.Cursor +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.set.SyncRow import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.set.SyncTable import com.mimetis.dotmim.sync.setup.SyncSetup import java.io.Closeable -import java.util.* abstract class DbSyncAdapter( val tableDescription: SyncTable, @@ -22,7 +22,7 @@ abstract class DbSyncAdapter( abstract fun disableConstraints() abstract fun reset() abstract fun deleteRow( - scopeId: UUID?, + scopeId: Uuid?, syncTimeStamp: Long?, isDeleted: Boolean, forceWrite: Boolean, @@ -30,7 +30,7 @@ abstract class DbSyncAdapter( ): Int abstract fun initializeRow( - scopeId: UUID?, + scopeId: Uuid?, syncTimeStamp: Long?, isDeleted: Boolean, forceWrite: Boolean, @@ -38,7 +38,7 @@ abstract class DbSyncAdapter( ): Int abstract fun updateRow( - scopeId: UUID?, + scopeId: Uuid?, syncTimeStamp: Long?, isDeleted: Boolean, forceWrite: Boolean, @@ -46,7 +46,7 @@ abstract class DbSyncAdapter( ): Int abstract fun updateMetadata( - scopeId: UUID?, + scopeId: Uuid?, isDeleted: Boolean, forceWrite: Boolean, row: SyncRow diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt index c957d6f..58bdc27 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt @@ -1,7 +1,10 @@ package com.mimetis.dotmim.sync -import android.annotation.SuppressLint import android.util.Base64 +import com.benasher44.uuid.Uuid +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.format +import kotlinx.datetime.format.byUnicodePattern import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.KSerializer @@ -11,21 +14,15 @@ import kotlinx.serialization.descriptors.buildSerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.* -import java.text.SimpleDateFormat -import java.util.* @ExperimentalSerializationApi object PrimitiveSerializer : KSerializer { - private const val dateFormat = "yyyy-MM-dd'T'HH:mm:ss" - - private val gmtTimeZone = TimeZone.getTimeZone("GMT") - - @SuppressLint("SimpleDateFormat") - private val simpleDateFormat = SimpleDateFormat(dateFormat).apply { timeZone = gmtTimeZone } + private val dateFormat = LocalDateTime.Format { byUnicodePattern("yyyy-MM-dd'T'HH:mm:ss") } +// private const val dateFormat = "yyyy-MM-dd'T'HH:mm:ss" @OptIn(InternalSerializationApi::class) override val descriptor: SerialDescriptor = - buildSerialDescriptor("PrimitiveSerializer", PolymorphicKind.SEALED) + buildSerialDescriptor("com.mimetis.dotmim.sync.PrimitiveSerializer", PolymorphicKind.SEALED) override fun serialize(encoder: Encoder, value: Any) { when (value) { @@ -36,8 +33,8 @@ object PrimitiveSerializer : KSerializer { is Double -> encoder.encodeDouble(value) is Float -> encoder.encodeFloat(value) is ByteArray -> encoder.encodeString(Base64.encodeToString(value, Base64.NO_WRAP)) - is UUID -> encoder.encodeString(value.toString().uppercase()) - is Date -> encoder.encodeString(simpleDateFormat.format(value)) + is Uuid -> encoder.encodeString(value.toString().uppercase()) + is LocalDateTime -> encoder.encodeString(value.format(dateFormat)) else -> encoder.encodeString(value.toString()) } } diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt index 4c205a2..8aa06c2 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt @@ -1,6 +1,7 @@ package com.mimetis.dotmim.sync import android.util.Log +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.args.ProgressArgs import com.mimetis.dotmim.sync.enumerations.ConflictResolutionPolicy import com.mimetis.dotmim.sync.enumerations.SyncProvision @@ -29,7 +30,7 @@ class SyncAgent( var completeTime = utcNow() val context = SyncContext( - sessionId = UUID.randomUUID(), + sessionId = Uuid.randomUUID(), scopeName = this.scopeName, parameters = this.parameters, syncType = syncType diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt index 40042de..fc53ea7 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync +import com.benasher44.uuid.Uuid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import com.mimetis.dotmim.sync.enumerations.SyncStage @@ -12,14 +13,14 @@ import java.util.* class SyncContext( @SerialName("id") @Serializable(with = UUIDSerializer::class) - var sessionId: UUID, + var sessionId: Uuid, @SerialName("sn") var scopeName: String, @SerialName("csid") @Serializable(with = UUIDSerializer::class) - var clientScopeId: UUID? = null, + var clientScopeId: Uuid? = null, @SerialName("typ") var syncType: SyncType = SyncType.values()[0], diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt index e547c78..86be752 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt @@ -1,20 +1,20 @@ package com.mimetis.dotmim.sync +import com.benasher44.uuid.Uuid import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder -import java.util.* -object UUIDSerializer : KSerializer { - override val descriptor = PrimitiveSerialDescriptor("com.mimetis.dotmim.sync-java.util.UUID", PrimitiveKind.STRING) +object UUIDSerializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("com.mimetis.dotmim.sync-com.benasher44.uuid.Uuid", PrimitiveKind.STRING) - override fun deserialize(decoder: Decoder): UUID { - return UUID.fromString(decoder.decodeString()) + override fun deserialize(decoder: Decoder): Uuid { + return Uuid.fromString(decoder.decodeString()) } - override fun serialize(encoder: Encoder, value: UUID) { + override fun serialize(encoder: Encoder, value: Uuid) { encoder.encodeString(value.toString().uppercase()) } } diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt index bb42f39..8c234ac 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync.orchestrators +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.* import com.mimetis.dotmim.sync.SyncVersion.major import com.mimetis.dotmim.sync.SyncVersion.toVersionInt @@ -172,7 +173,7 @@ class LocalOrchestrator( // On local, we don't want to chase rows from "others" // We just want our local rows, so we dont exclude any remote scope id, by setting scope id to NULL - val remoteScopeId: UUID? = null + val remoteScopeId: Uuid? = null // lastSyncTS : get lines inserted / updated / deteleted after the last sync commited val lastSyncTS = scopeInfo.lastSyncTimestamp // isNew : If isNew, lasttimestamp is not correct, so grab all @@ -305,7 +306,7 @@ class LocalOrchestrator( // Create the message containing everything needed to apply changes val applyChanges = MessageApplyChanges( scope.id, - UUID.fromString("00000000-0000-0000-0000-000000000000"), + Uuid.fromString("00000000-0000-0000-0000-000000000000"), isNew, lastSyncTS, schema, diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt index 8410576..ccd3c46 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt @@ -2,7 +2,6 @@ package com.mimetis.dotmim.sync.set import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import okio.utf8Size import com.mimetis.dotmim.sync.PrimitiveSerializer import com.mimetis.dotmim.sync.serialization.DmUtils import java.math.BigDecimal @@ -43,7 +42,7 @@ class ContainerTable( // else if (obj is DBNull) // byteCount += 5 else if (objType == String::class.java) - byteCount += (obj as String).utf8Size() + byteCount += (obj as String).length else if (objType == ByteArray::class.java) byteCount += (obj as ByteArray).size else @@ -51,7 +50,7 @@ class ContainerTable( // Size for the type if (objType != null) - byteCount += DmUtils.getAssemblyQualifiedName(objType).utf8Size() + byteCount += DmUtils.getAssemblyQualifiedName(objType).length // State byteCount += 4 diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncSet.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncSet.kt index a9035d1..6f0f1fa 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncSet.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncSet.kt @@ -24,7 +24,7 @@ class SyncSet( */ @SerialName("f") var filters: SyncFilters -) : Closeable { +) : AutoCloseable { /** * Create a new SyncSet, empty */ diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt index 737a036..a6dbb28 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt @@ -2,16 +2,18 @@ package com.mimetis.dotmim.sync.sqlite import android.database.Cursor import android.database.Cursor.* -import androidx.core.database.* object CursorHelper { fun Cursor.getValue(columnIndex: Int): Any? = + if (this.isNull(columnIndex)) + null + else when (this.getType(columnIndex)) { FIELD_TYPE_NULL -> null - FIELD_TYPE_INTEGER -> this.getIntOrNull(columnIndex) - FIELD_TYPE_FLOAT -> this.getDoubleOrNull(columnIndex) - FIELD_TYPE_STRING -> this.getStringOrNull(columnIndex) - FIELD_TYPE_BLOB -> this.getBlobOrNull(columnIndex) + FIELD_TYPE_INTEGER -> this.getInt(columnIndex) + FIELD_TYPE_FLOAT -> this.getDouble(columnIndex) + FIELD_TYPE_STRING -> this.getString(columnIndex) + FIELD_TYPE_BLOB -> this.getBlob(columnIndex) else -> null } diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt index 4ec229c..218084d 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt @@ -2,9 +2,8 @@ package com.mimetis.dotmim.sync.sqlite import android.database.Cursor import android.database.sqlite.SQLiteDatabase -import androidx.core.database.getStringOrNull +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.SyncVersion -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import com.mimetis.dotmim.sync.builders.DbScopeBuilder @@ -71,7 +70,7 @@ class SqliteScopeBuilder( } } - override fun existsScopeInfo(scopeId: UUID): Boolean = + override fun existsScopeInfo(scopeId: Uuid): Boolean = database.rawQuery( "Select count(*) from ${scopeInfoTableName.unquoted()} where sync_scope_id=?", arrayOf(scopeId.toString()) @@ -129,7 +128,7 @@ class SqliteScopeBuilder( private fun readScope(cursor: Cursor, json: Json) = ScopeInfo( - id = UUID.fromString(cursor.getString(cursor.getColumnIndex("sync_scope_id"))), + id = Uuid.fromString(cursor.getString(cursor.getColumnIndex("sync_scope_id"))), name = cursor.getString(cursor.getColumnIndex("sync_scope_name")), schema = if (cursor.isNull(cursor.getColumnIndex("sync_scope_schema"))) null else json.decodeFromString( cursor.getString(cursor.getColumnIndex("sync_scope_schema")) @@ -137,7 +136,9 @@ class SqliteScopeBuilder( setup = if (cursor.isNull(cursor.getColumnIndex("sync_scope_setup"))) null else json.decodeFromString( cursor.getString(cursor.getColumnIndex("sync_scope_setup")) ), - version = cursor.getStringOrNull(cursor.getColumnIndex("sync_scope_version")) ?: SyncVersion.current, + version = (if (cursor.isNull(cursor.getColumnIndex("sync_scope_version"))) null else cursor.getString( + cursor.getColumnIndex("sync_scope_version") + )) ?: SyncVersion.current, lastSync = if (cursor.isNull(cursor.getColumnIndex("scope_last_sync"))) null else cursor.getLong( cursor.getColumnIndex("scope_last_sync") ), diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt index c55a337..3429b69 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt @@ -1,309 +1,147 @@ package com.mimetis.dotmim.sync.web.client -import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json -import okhttp3.Interceptor -import okhttp3.MediaType.Companion.toMediaType -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.RequestBody.Companion.toRequestBody -import okio.Buffer -import retrofit2.Retrofit -import retrofit2.http.Body -import retrofit2.http.Header -import retrofit2.http.POST import com.mimetis.dotmim.sync.serialization.Converter -import com.mimetis.dotmim.sync.web.client.* -import okhttp3.JavaNetCookieJar -import ru.gildor.coroutines.okhttp.await -import java.net.CookieManager -import java.util.* -import java.util.concurrent.TimeUnit - -class DotmimServiceImpl( - val serviceAddress: String +import io.ktor.client.HttpClient +import io.ktor.client.call.body +import io.ktor.client.plugins.HttpSend +import io.ktor.client.plugins.plugin +import io.ktor.client.request.post +import io.ktor.client.request.setBody +import io.ktor.client.statement.readBytes +import io.ktor.http.ContentType +import io.ktor.http.HttpHeaders +import io.ktor.http.contentType + +internal class DotmimServiceImpl( + serviceAddress: String, + val client: HttpClient ) { - private interface DotmimServiceInternal { - @POST("sync") - suspend fun ensureSchema( - @Header("AuthHeader") - authHeader: String, - - @Header("dotmim-sync-session-id") - sessionId: String, - - @Header("dotmim-sync-scope-name") - scopeName: String, - - @Header("dotmim-sync-step") - step: Int, - - @Body - args: HttpMessageEnsureScopesRequest, - - @Header("dotmim-sync-converter") - converterKey: String? = null - ): HttpMessageEnsureSchemaResponse - - @POST("sync") - suspend fun ensureScope( - @Header("AuthHeader") - authHeader: String, - - @Header("dotmim-sync-session-id") - sessionId: String, - - @Header("dotmim-sync-scope-name") - scopeName: String, - - @Header("dotmim-sync-step") - step: Int, - - @Body - args: HttpMessageEnsureScopesRequest, - - @Header("dotmim-sync-converter") - converterKey: String? = null - ): HttpMessageEnsureScopesResponse - - /** - * Used for both SendChanges and GetChanges - * @see HttpStep.SendChanges - * @see HttpStep.GetChanges - * @see HttpStep.GetSnapshot - * @see HttpStep.GetEstimatedChangesCount - */ - @POST("sync") - suspend fun changes( - @Header("AuthHeader") - authHeader: String, - - @Header("dotmim-sync-session-id") - sessionId: String, - - @Header("dotmim-sync-scope-name") - scopeName: String, - - @Header("dotmim-sync-step") - step: Int, - - @Body - args: HttpMessageSendChangesRequest, - - @Header("dotmim-sync-converter") - converterKey: String? = null - ): HttpMessageSummaryResponse - -// @POST("sync") -// suspend fun sendMoreChanges( -// @Header("AuthHeader") -// authHeader: String, -// -// @Header("dotmim-sync-session-id") -// sessionId: String, -// -// @Header("dotmim-sync-scope-name") -// scopeName: String, -// -// @Header("dotmim-sync-step") -// step: Int, -// -// @Body -// args: HttpMessageGetMoreChangesRequest, -// -// @Header("dotmim-sync-converter") -// converterKey: String? = null -// ): HttpMessageSendChangesResponse - - @POST("sync") - suspend fun endOfDownloadChanges( - @Header("AuthHeader") - authHeader: String, - - @Header("dotmim-sync-session-id") - sessionId: String, - - @Header("dotmim-sync-scope-name") - scopeName: String, - - @Header("dotmim-sync-step") - step: Int, - - @Body - args: HttpMessageGetMoreChangesRequest, - - @Header("dotmim-sync-converter") - converterKey: String? = null - ) - - @POST("sync") - suspend fun summary( - @Header("AuthHeader") - authHeader: String, - - @Header("dotmim-sync-session-id") - sessionId: String, - - @Header("dotmim-sync-scope-name") - scopeName: String, - - @Header("dotmim-sync-step") - step: Int, - - @Body - args: HttpMessageSendChangesRequest, - - @Header("dotmim-sync-converter") - converterKey: String? = null - ): HttpMessageSummaryResponse - } - - private val okHttpClient: OkHttpClient - private val json = Json { - ignoreUnknownKeys = true - isLenient = true - } - - private var service: DotmimServiceInternal + private val url = serviceAddress.trimEnd('/') + "/sync" suspend fun ensureScope( authHeader: String, args: HttpMessageEnsureScopesRequest, converter: Converter? ): HttpMessageEnsureScopesResponse = - service.ensureScope( - authHeader, - args.syncContext.sessionId.toString(), - args.syncContext.scopeName, - HttpStep.EnsureScopes.value, - args, - converter?.key - ) + client.post(url) { + headers.append(HttpHeaders.Authorization, authHeader) + headers.append("dotmim-sync-session-id", args.syncContext.sessionId.toString()) + headers.append("dotmim-sync-scope-name", args.syncContext.scopeName) + headers.append("dotmim-sync-step", HttpStep.EnsureScopes.value.toString()) + if (converter != null) + headers.append("dotmim-sync-converter", converter.key) + + contentType(ContentType.Application.Json) + setBody(args) + }.body() suspend fun ensureSchema( authHeader: String, args: HttpMessageEnsureScopesRequest, converter: Converter? ): HttpMessageEnsureSchemaResponse = - service.ensureSchema( - authHeader, - args.syncContext.sessionId.toString(), - args.syncContext.scopeName, - HttpStep.EnsureSchema.value, - args, - converter?.key - ) + client.post(url) { + headers.append(HttpHeaders.Authorization, authHeader) + headers.append("dotmim-sync-session-id", args.syncContext.sessionId.toString()) + headers.append("dotmim-sync-scope-name", args.syncContext.scopeName) + headers.append("dotmim-sync-step", HttpStep.EnsureSchema.value.toString()) + if (converter != null) + headers.append("dotmim-sync-converter", converter.key) + + contentType(ContentType.Application.Json) + setBody(args) + }.body() suspend fun getSnapshot( authHeader: String, args: HttpMessageSendChangesRequest, converter: Converter? ): HttpMessageSummaryResponse = - service.changes( - authHeader, - args.syncContext.sessionId.toString(), - args.syncContext.scopeName, - HttpStep.GetSnapshot.value, - args, - converter?.key - ) + client.post(url) { + headers.append(HttpHeaders.Authorization, authHeader) + headers.append("dotmim-sync-session-id", args.syncContext.sessionId.toString()) + headers.append("dotmim-sync-scope-name", args.syncContext.scopeName) + headers.append("dotmim-sync-step", HttpStep.GetSnapshot.value.toString()) + if (converter != null) + headers.append("dotmim-sync-converter", converter.key) + + contentType(ContentType.Application.Json) + setBody(args) + }.body() suspend fun sendChanges( authHeader: String, args: HttpMessageSendChangesRequest, converter: Converter? ): HttpMessageSummaryResponse = - service.changes( - authHeader, - args.syncContext.sessionId.toString(), - args.syncContext.scopeName, - HttpStep.SendChangesInProgress.value, - args, - converter?.key - ) + client.post(url) { + headers.append(HttpHeaders.Authorization, authHeader) + headers.append("dotmim-sync-session-id", args.syncContext.sessionId.toString()) + headers.append("dotmim-sync-scope-name", args.syncContext.scopeName) + headers.append("dotmim-sync-step", HttpStep.SendChangesInProgress.value.toString()) + if (converter != null) + headers.append("dotmim-sync-converter", converter.key) + + contentType(ContentType.Application.Json) + setBody(args) + }.body() suspend fun moreChanges( authHeader: String, args: HttpMessageGetMoreChangesRequest, converter: Converter? - ): ByteArray { - val requestBuilder = Request.Builder() - .url("${serviceAddress}sync") - .header("AuthHeader", authHeader) - .header("dotmim-sync-session-id", args.syncContext.sessionId.toString()) - .header("dotmim-sync-scope-name", args.syncContext.scopeName) - .header("dotmim-sync-step", HttpStep.GetSummary.value.toString()) - .post(json.encodeToString(args).toRequestBody("application/json".toMediaType())) - if (converter != null) - requestBuilder.header("dotmim-sync-converter", converter.key) - val response = okHttpClient.newCall(requestBuilder.build()).await() - return response.body!!.bytes() -// return service.sendMoreChanges(authHeader, args.syncContext.sessionId.toString(), args.syncContext.scopeName, HttpStep.GetMoreChanges.value, args, converter?.key) - } + ): ByteArray = + client.post(url) { + headers.append(HttpHeaders.Authorization, authHeader) + headers.append("dotmim-sync-session-id", args.syncContext.sessionId.toString()) + headers.append("dotmim-sync-scope-name", args.syncContext.scopeName) + headers.append("dotmim-sync-step", HttpStep.GetSummary.value.toString()) + if (converter != null) + headers.append("dotmim-sync-converter", converter.key) + + contentType(ContentType.Application.Json) + setBody(args) + }.readBytes() suspend fun endDownloadChanges( authHeader: String, args: HttpMessageGetMoreChangesRequest, converter: Converter? - ) { - service.endOfDownloadChanges( - authHeader, - args.syncContext.sessionId.toString(), - args.syncContext.scopeName, - HttpStep.SendEndDownloadChanges.value, - args, - converter?.key - ) - } + ): HttpMessageGetMoreChangesRequest = + client.post(url) { + headers.append(HttpHeaders.Authorization, authHeader) + headers.append("dotmim-sync-session-id", args.syncContext.sessionId.toString()) + headers.append("dotmim-sync-scope-name", args.syncContext.scopeName) + headers.append("dotmim-sync-step", HttpStep.SendEndDownloadChanges.value.toString()) + if (converter != null) + headers.append("dotmim-sync-converter", converter.key) + + contentType(ContentType.Application.Json) + setBody(args) + }.body() suspend fun getSummary( authHeader: String, args: HttpMessageSendChangesRequest, converter: Converter? ): HttpMessageSummaryResponse = - service.summary( - authHeader, - args.syncContext.sessionId.toString(), - args.syncContext.scopeName, - HttpStep.GetSummary.value, - args, - converter?.key - ) + client.post(url) { + headers.append(HttpHeaders.Authorization, authHeader) + headers.append("dotmim-sync-session-id", args.syncContext.sessionId.toString()) + headers.append("dotmim-sync-scope-name", args.syncContext.scopeName) + headers.append("dotmim-sync-step", HttpStep.GetSummary.value.toString()) + if (converter != null) + headers.append("dotmim-sync-converter", converter.key) + + contentType(ContentType.Application.Json) + setBody(args) + }.body() init { - okHttpClient = OkHttpClient.Builder() - .connectTimeout(10, TimeUnit.SECONDS) - .readTimeout(300, TimeUnit.SECONDS) - .cookieJar(JavaNetCookieJar(CookieManager())) - .addInterceptor { chain: Interceptor.Chain -> - val buffer = Buffer() - chain.request().body?.writeTo(buffer) - val bodyHash = buffer.sha256().base64() - val authHeader = chain.request().header("AuthHeader") ?: "" - val request = chain.request().newBuilder() - .removeHeader("AuthHeader") - .addHeader("Authorization", authHeader) - .addHeader("dotmim-sync-serialization-format", "{\"f\":\"json\", \"s\":0}") - .addHeader("dotmim-sync-hash", bodyHash) - .build() - - val response = chain.proceed(request) -// if (!response.isSuccessful) -// CrashesHelper.logError(response, "DotmimServiceImpl.request") - - return@addInterceptor response - } - .build() - val retrofit = Retrofit.Builder() - .baseUrl(serviceAddress) - .client(okHttpClient) - .addConverterFactory(json.asConverterFactory("application/json".toMediaType())) - .build() - service = retrofit.create(DotmimServiceInternal::class.java) + client.plugin(HttpSend).intercept { request -> + request.headers.append("dotmim-sync-serialization-format", """{"f":"json", "s":0}""") +// request.headers.append("dotmim-sync-hash", "123") + execute(request) + } } - -// companion object { -// private val TAG = DotmimServiceImpl::class.java.simpleName -// } } diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt index 5b16b8d..d86ba3b 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt @@ -17,19 +17,21 @@ import com.mimetis.dotmim.sync.serialization.Converter import com.mimetis.dotmim.sync.set.ContainerSet import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.setup.SyncSetup +import io.ktor.client.HttpClient import java.io.File import java.net.URL import java.text.SimpleDateFormat import java.util.* class WebClientOrchestrator( - serviceAddress: String, + private val serviceAddress: String, + client: HttpClient, private val authHeader: String, private val converter: Converter? = null, private val maxDownladingDegreeOfParallelism: Int = 4 ) : RemoteOrchestrator(FancyCoreProvider(), SyncOptions(), SyncSetup()) { private val TAG = this::class.java.simpleName - private val service = DotmimServiceImpl(serviceAddress) + private val service = DotmimServiceImpl(serviceAddress, client) /** * Send a request to remote web proxy for First step : Ensure scopes and schema @@ -509,7 +511,7 @@ class WebClientOrchestrator( .forEach { table -> table.rows.forEach { row -> this.converter?.afterDeserialized(row) } } private fun getServiceHost() = - URL(service.serviceAddress).host + URL(serviceAddress).host private fun beforeSerializeRows(data: SyncSet) { data.tables From 0ed0c0eaeac905f40988725e42b792408988923e Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 1 Dec 2024 16:41:37 +0100 Subject: [PATCH 05/81] Uuid updates --- .../com/mimetis/dotmim/sync/SyncResult.kt | 3 ++- .../mimetis/dotmim/sync/SyncTypeConverter.kt | 5 ++-- .../sync/args/ApplyChangesFailedArgs.kt | 3 ++- .../mimetis/dotmim/sync/batch/BatchInfo.kt | 3 ++- .../dotmim/sync/builders/DbScopeBuilder.kt | 3 ++- .../sync/messages/MessageApplyChanges.kt | 5 ++-- .../sync/messages/MessageGetChangesBatch.kt | 5 ++-- .../sync/orchestrators/BaseOrchestrator.kt | 23 ++++++++++--------- .../mimetis/dotmim/sync/scopes/ScopeInfo.kt | 3 ++- .../dotmim/sync/serialization/DmUtils.kt | 3 ++- .../mimetis/dotmim/sync/set/ContainerTable.kt | 3 ++- .../com/mimetis/dotmim/sync/set/SyncColumn.kt | 5 ++-- .../dotmim/sync/sqlite/SqliteQueryWrapper.kt | 3 ++- .../dotmim/sync/sqlite/SqliteSyncAdapter.kt | 9 ++++---- .../sync/web/client/WebClientOrchestrator.kt | 5 ++-- 15 files changed, 48 insertions(+), 33 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt index 9204065..d70c32a 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.messages.DatabaseChangesApplied import com.mimetis.dotmim.sync.messages.DatabaseChangesSelected import kotlinx.serialization.Serializable @@ -16,7 +17,7 @@ class SyncResult( * Current Session, in progress */ @Serializable(with = UUIDSerializer::class) - var sessionId: UUID, + var sessionId: Uuid, /** * Gets or sets the time when a sync sessionn started. diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt index 82c4987..78e73f4 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync +import com.benasher44.uuid.Uuid import java.math.BigDecimal import java.util.* @@ -38,8 +39,8 @@ object SyncTypeConverter { tryConvertTo(value) typeOfT == Boolean::class.java -> tryConvertTo(value) - typeOfT == UUID::class.java -> - tryConvertTo(value) + typeOfT == Uuid::class.java -> + tryConvertTo(value) typeOfT == Char::class.java -> tryConvertTo(value) typeOfT == BigDecimal::class.java -> diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt index 40939cc..5ad47a2 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync.args +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.SyncConflict import com.mimetis.dotmim.sync.SyncContext import com.mimetis.dotmim.sync.enumerations.ConflictResolution @@ -23,7 +24,7 @@ class ApplyChangesFailedArgs( /** * Gets or Sets the scope id who will be marked as winner */ - val senderScopeId: UUID? + val senderScopeId: Uuid? ) : ProgressArgs(context) { private var _resolution: ConflictResolution = resolution diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt index e63832c..bd33f4a 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync.batch +import com.benasher44.uuid.Uuid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -282,7 +283,7 @@ class BatchInfo() { else -> throw Exception("OverflowException: too much batches !!!") } - return "${index}_${UUID.randomUUID().toString().replace(".", "_")}.batch" + return "${index}_${Uuid.randomUUID().toString().replace(".", "_")}.batch" } } } diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt index 13ce3b5..14c8f2f 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync.builders +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.scopes.ScopeInfo import java.util.* @@ -11,7 +12,7 @@ abstract class DbScopeBuilder( abstract fun existsScopeInfoTable(): Boolean abstract fun createScopeInfoTable() abstract fun getAllScopes(scopeName: String): MutableList - abstract fun existsScopeInfo(scopeId: UUID): Boolean + abstract fun existsScopeInfo(scopeId: Uuid): Boolean abstract fun insertScope(scopeInfo: ScopeInfo): ScopeInfo abstract fun updateScope(scopeInfo: ScopeInfo): ScopeInfo abstract fun getLocalTimestamp(): Long diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt index 53206c0..1ae545a 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync.messages +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.batch.BatchInfo import com.mimetis.dotmim.sync.enumerations.ConflictResolutionPolicy import com.mimetis.dotmim.sync.set.SyncSet @@ -13,12 +14,12 @@ class MessageApplyChanges( /** * Gets the local Scope Id */ - val localScopeId: UUID, + val localScopeId: Uuid, /** * Gets the sender Scope Id */ - val senderScopeId: UUID?, + val senderScopeId: Uuid?, /** * Gets or Sets if the sync is a first sync. In this case, the last sync timestamp is ignored diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt index af29845..25e2efb 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync.messages +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.setup.SyncSetup import java.util.* @@ -12,12 +13,12 @@ class MessageGetChangesBatch( * Gets or Sets the Scope Id that should be excluded when we get lines from the local store * Usable only from Server side */ - var excludingScopeId: UUID? = null, + var excludingScopeId: Uuid? = null, /** * Gets or Sets the local Scope Id that will replace values when creating the row */ - var localScopeId: UUID, + var localScopeId: Uuid, /** * Gets or Sets if the sync is a first sync. In this case, the last sync timestamp is ignored diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt index 05399b0..4c82074 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt @@ -1,6 +1,7 @@ package com.mimetis.dotmim.sync.orchestrators import android.database.Cursor +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.* import com.mimetis.dotmim.sync.args.* import com.mimetis.dotmim.sync.batch.BatchInfo @@ -80,7 +81,7 @@ abstract class BaseOrchestrator( open fun getContext(): SyncContext { return syncContext ?: SyncContext( - sessionId = UUID.randomUUID(), + sessionId = Uuid.randomUUID(), scopeName = this.scopeName ) } @@ -317,7 +318,7 @@ abstract class BaseOrchestrator( val scopes = scopeBuilder.getAllScopes(scopeName) if (scopes.isEmpty()) { var scope = ScopeInfo( - id = UUID.randomUUID(), + id = Uuid.randomUUID(), name = scopeName, isNewScope = true, lastSync = null, @@ -1295,7 +1296,7 @@ abstract class BaseOrchestrator( * The int returned is the conflict count I need */ private fun handleConflict( - localScopeId: UUID, senderScopeId: UUID?, syncAdapter: DbSyncAdapter, + localScopeId: Uuid, senderScopeId: Uuid?, syncAdapter: DbSyncAdapter, context: SyncContext, conflictRow: SyncRow, schemaChangesTable: SyncTable, policy: ConflictResolutionPolicy, lastTimestamp: Long? ): Triple { @@ -1451,10 +1452,10 @@ abstract class BaseOrchestrator( * A conflict has occured, we try to ask for the solution to the user */ private fun getConflictAction( - context: SyncContext, localScopeId: UUID?, syncAdapter: DbSyncAdapter, + context: SyncContext, localScopeId: Uuid?, syncAdapter: DbSyncAdapter, conflictRow: SyncRow, schemaChangesTable: SyncTable, policy: ConflictResolutionPolicy, - senderScopeId: UUID? - ): Tuple { + senderScopeId: Uuid? + ): Tuple { // default action var resolution = if (policy == ConflictResolutionPolicy.ClientWins) ConflictResolution.ClientWins else ConflictResolution.ServerWins @@ -1467,7 +1468,7 @@ abstract class BaseOrchestrator( var finalRow: SyncRow? = null var localRow: SyncRow? = null - var finalSenderScopeId: UUID? = senderScopeId + var finalSenderScopeId: Uuid? = senderScopeId // default conflict type var conflictType = @@ -1566,7 +1567,7 @@ abstract class BaseOrchestrator( private fun internalGetConflictRow( context: SyncContext, syncAdapter: DbSyncAdapter, - localScopeId: UUID, + localScopeId: Uuid, primaryKeyRow: SyncRow, schema: SyncTable ): SyncRow? { @@ -1640,7 +1641,7 @@ abstract class BaseOrchestrator( */ private fun internalApplyConflictUpdate( context: SyncContext, syncAdapter: DbSyncAdapter, - row: SyncRow, lastTimestamp: Long?, senderScopeId: UUID?, + row: SyncRow, lastTimestamp: Long?, senderScopeId: Uuid?, forceWrite: Boolean ): Boolean { if (row.table == null) @@ -1657,7 +1658,7 @@ abstract class BaseOrchestrator( */ private fun internalApplyConflictDelete( context: SyncContext, syncAdapter: DbSyncAdapter, - row: SyncRow, lastTimestamp: Long?, senderScopeId: UUID?, + row: SyncRow, lastTimestamp: Long?, senderScopeId: Uuid?, forceWrite: Boolean ): Boolean { if (row.table == null) @@ -1675,7 +1676,7 @@ abstract class BaseOrchestrator( */ private fun internalUpdateMetadatas( context: SyncContext, syncAdapter: DbSyncAdapter, - row: SyncRow, senderScopeId: UUID?, forceWrite: Boolean + row: SyncRow, senderScopeId: Uuid?, forceWrite: Boolean ): Boolean { val metadataUpdatedRowsCount = syncAdapter.updateMetadata( senderScopeId, diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt index 6daccaa..fc0abb7 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync.scopes +import com.benasher44.uuid.Uuid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -24,7 +25,7 @@ class ScopeInfo( */ @SerialName("id") @Serializable(with = UUIDSerializer::class) - var id: UUID, + var id: Uuid, /** * Gets or Sets if the current provider is newly created one in database. diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt index 9e4f00d..a38e70f 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync.serialization +import com.benasher44.uuid.Uuid import java.math.BigDecimal import java.util.* @@ -36,7 +37,7 @@ object DmUtils { // "14" BigDecimal::class.java -> "15" - UUID::class.java -> + Uuid::class.java -> "16" String::class.java -> "17" diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt index ccd3c46..8d77316 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync.set +import com.benasher44.uuid.Uuid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import com.mimetis.dotmim.sync.PrimitiveSerializer @@ -75,7 +76,7 @@ class ContainerTable( 2 Int::class.java, UInt::class.java, Float::class.java -> 4 - BigDecimal::class.java, UUID::class.java -> + BigDecimal::class.java, Uuid::class.java -> 16 else -> 0 diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt index 7c73041..25bde7d 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt @@ -1,5 +1,6 @@ package com.mimetis.dotmim.sync.set +import com.benasher44.uuid.Uuid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import com.mimetis.dotmim.sync.setup.DbType @@ -112,7 +113,7 @@ class SyncColumn( // "14" BigDecimal::class.java -> "15" - UUID::class.java -> + Uuid::class.java -> "16" String::class.java -> "17" @@ -255,7 +256,7 @@ class SyncColumn( "15" -> BigDecimal::class.java "16" -> - UUID::class.java + Uuid::class.java "17" -> String::class.java // "18"-> diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt index 7042ecb..a2cb8a2 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt @@ -3,6 +3,7 @@ package com.mimetis.dotmim.sync.sqlite import android.database.Cursor import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteStatement +import com.benasher44.uuid.Uuid import java.io.Closeable import java.math.BigDecimal import java.text.SimpleDateFormat @@ -118,7 +119,7 @@ class SqliteQueryWrapper( is Double -> statement?.bindDouble(index++, value) is Float -> statement?.bindDouble(index++, value.toDouble()) is BigDecimal -> statement?.bindDouble(index++, value.toDouble()) - is UUID -> statement?.bindString(index++, value.toString().uppercase()) + is Uuid -> statement?.bindString(index++, value.toString().uppercase()) is Date -> statement?.bindString(index++, dateFormat.format(value)) else -> statement?.bindString(index++, value.toString()) } diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt index 33c45c0..7577889 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt @@ -4,6 +4,7 @@ import android.database.Cursor import android.database.sqlite.SQLiteDatabase import android.os.Build import android.util.Base64 +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.DbSyncAdapter import com.mimetis.dotmim.sync.builders.ParserName import com.mimetis.dotmim.sync.set.SyncColumn @@ -237,7 +238,7 @@ class SqliteSyncAdapter( } override fun deleteRow( - scopeId: UUID?, + scopeId: Uuid?, syncTimeStamp: Long?, isDeleted: Boolean, forceWrite: Boolean, @@ -334,7 +335,7 @@ class SqliteSyncAdapter( } override fun initializeRow( - scopeId: UUID?, + scopeId: Uuid?, syncTimeStamp: Long?, isDeleted: Boolean, forceWrite: Boolean, @@ -502,7 +503,7 @@ class SqliteSyncAdapter( } override fun updateRow( - scopeId: UUID?, + scopeId: Uuid?, syncTimeStamp: Long?, isDeleted: Boolean, forceWrite: Boolean, @@ -566,7 +567,7 @@ class SqliteSyncAdapter( } override fun updateMetadata( - scopeId: UUID?, + scopeId: Uuid?, isDeleted: Boolean, forceWrite: Boolean, row: SyncRow diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt index d86ba3b..b0e8373 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt @@ -1,6 +1,7 @@ package com.mimetis.dotmim.sync.web.client import android.util.Log +import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.* import com.mimetis.dotmim.sync.args.* import com.mimetis.dotmim.sync.batch.BatchInfo @@ -131,7 +132,7 @@ class WebClientOrchestrator( val batchDirectoryRoot = this.options.batchDirectory val batchDirectoryName = SimpleDateFormat("yyyy_MM_dd_ss", Locale.getDefault()).format( Calendar.getInstance(Locale.getDefault()).time - ) + UUID.randomUUID().toString().replace(".", "") + ) + Uuid.randomUUID().toString().replace(".", "") val batchDirectoryFullPath = File(batchDirectoryRoot, batchDirectoryName).absolutePath // Create the BatchInfo serialized (forced because in a snapshot call, so we are obviously serialized on disk) @@ -408,7 +409,7 @@ class WebClientOrchestrator( val batchDirectoryRoot = this.options.batchDirectory val batchDirectoryName = SimpleDateFormat("yyyy_MM_dd_ss", Locale.getDefault()).format( Calendar.getInstance(Locale.getDefault()).time - ) + UUID.randomUUID().toString().replace(".", "") + ) + Uuid.randomUUID().toString().replace(".", "") serverBatchInfo.directoryRoot = batchDirectoryRoot serverBatchInfo.directoryName = batchDirectoryName From 0aab2feefdc7157aa518ad4ae1396eae31994553 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 1 Dec 2024 20:01:23 +0100 Subject: [PATCH 06/81] Readme update --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9a57757..3aac6ff 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Android (Kotlin) port for [Dotmim.Sync](https://github.com/Mimetis/Dotmim.Sync) ## Adding dependencies To use library in your app add link to JitPack repo -``` +```gradle allprojects { repositories { ... @@ -18,14 +18,14 @@ To use library in your app add link to JitPack repo } ``` and add library dependency to your app build.gradle -``` +```gradle dependencies { implementation 'com.github.vunder:dotmimsync:VERSION' } ``` Also it is necessary to add this dependency to make library work correctly with http-session. You can use newer version in case it is available -``` +```gradle dependencies { implementation 'com.squareup.okhttp3:okhttp-urlconnection:5.0.0-alpha.2' } @@ -38,6 +38,8 @@ General use-cases you can find in original library documentation ## Dotmim.Sync version match table Here is a version match table. Left column represent current library, right column - Dotmim.Sync library + |Library version|Dotmim.Sync version| |-|-| -|1.0-1.0.2|0.9.1 or lower| +|1.0-1.0.10|0.9.1 or lower| +|1.1.0|0.9.1 or lower| \ No newline at end of file From 808bd1dc106f0b47a8b918b8c73e38c72ffb836d Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Mon, 2 Dec 2024 09:15:23 +0100 Subject: [PATCH 07/81] Removed unnecessary dependencies Added SHA256 hash for sync requests --- gradle/libs.versions.toml | 6 ------ shared/build.gradle.kts | 4 ++-- .../dotmim/sync/web/client/DotmimServiceImpl.kt | 13 ++++++++++++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 988face..a4c7119 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,12 +22,8 @@ kotlinx-uuid = { module = "com.benasher44:uuid", version.ref = "benasher44-uuid" androidx-sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" } ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } -ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } -ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" } ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } -ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" } ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } -ktor-client-auth = { module = "io.ktor:ktor-client-auth", version.ref = "ktor" } [plugins] androidLibrary = { id = "com.android.library", version.ref = "agp" } @@ -42,7 +38,5 @@ jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serializati ktor = [ "ktor-client-core", "ktor-client-content-negotiation", - "ktor-client-auth", - "ktor-client-logging", "ktor-serialization-kotlinx-json", ] \ No newline at end of file diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 5575ac9..1321fb5 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -40,10 +40,10 @@ kotlin { implementation(libs.bundles.ktor) } androidMain.dependencies { - implementation(libs.ktor.client.okhttp) +// implementation(libs.ktor.client.okhttp) } iosMain.dependencies { - implementation(libs.ktor.client.darwin) +// implementation(libs.ktor.client.darwin) } commonTest.dependencies { implementation(libs.kotlin.test) diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt index 3429b69..3eca671 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt @@ -10,8 +10,13 @@ import io.ktor.client.request.setBody import io.ktor.client.statement.readBytes import io.ktor.http.ContentType import io.ktor.http.HttpHeaders +import io.ktor.http.content.OutgoingContent import io.ktor.http.contentType +import java.security.MessageDigest +import kotlin.io.encoding.Base64 +import kotlin.io.encoding.ExperimentalEncodingApi +@OptIn(ExperimentalEncodingApi::class) internal class DotmimServiceImpl( serviceAddress: String, val client: HttpClient @@ -138,9 +143,15 @@ internal class DotmimServiceImpl( }.body() init { + val md = MessageDigest.getInstance("SHA-256") client.plugin(HttpSend).intercept { request -> request.headers.append("dotmim-sync-serialization-format", """{"f":"json", "s":0}""") -// request.headers.append("dotmim-sync-hash", "123") + if (request.body is OutgoingContent.ByteArrayContent) { + val bytes = (request.body as OutgoingContent.ByteArrayContent).bytes() + val digest = md.digest(bytes) + val hash = Base64.encode(digest) + request.headers.append("dotmim-sync-hash", hash) + } execute(request) } } From fa5483fc9740f8b84371282ae9942f02cead8dda Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Mon, 2 Dec 2024 15:06:12 +0100 Subject: [PATCH 08/81] Updating JVM version --- .idea/compiler.xml | 2 +- .idea/gradle.xml | 9 ++++----- shared/build.gradle.kts | 6 +++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 61a9130..b86273d 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 34e4d3b..08ea2a3 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,17 +4,16 @@ diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 1321fb5..b792e7f 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -11,7 +11,7 @@ kotlin { compilations.all { compileTaskProvider.configure { compilerOptions { - jvmTarget.set(JvmTarget.JVM_1_8) + jvmTarget.set(JvmTarget.JVM_18) } } } @@ -58,7 +58,7 @@ android { minSdk = 26 } compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_18 + targetCompatibility = JavaVersion.VERSION_18 } } From 648d2e986e391ffc89e8da3e480e877de3989e28 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Mon, 2 Dec 2024 15:40:54 +0100 Subject: [PATCH 09/81] Added linux build action --- .github/workflow/build-linux.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflow/build-linux.yml diff --git a/.github/workflow/build-linux.yml b/.github/workflow/build-linux.yml new file mode 100644 index 0000000..b43c68a --- /dev/null +++ b/.github/workflow/build-linux.yml @@ -0,0 +1,28 @@ +name: Build Linux + +on: + push: + branches: [ "master" ] + paths-ignore: + - "**/*.md" + pull_request: + branches: [ "master" ] + paths-ignore: + - "**/*.md" + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: corretto + + - name: Linux build + run: chmod +x gradlew + - name: Build with Gradle + run: ./gradlew build From e65edfd858b050f3c018ee2c852aa179d7d41bb5 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Mon, 2 Dec 2024 21:15:59 +0100 Subject: [PATCH 10/81] Trying jitpack build --- gradle/libs.versions.toml | 2 ++ settings.gradle.kts | 1 + shared/build.gradle.kts | 2 ++ 3 files changed, 5 insertions(+) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a4c7119..95d67e6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,6 @@ [versions] agp = "8.7.2" +gradle-simple = "1.0" kotlin = "2.0.20" serialization = "1.7.3" kotlinx-datetime = "0.6.1" @@ -8,6 +9,7 @@ sqlite = "2.5.0-alpha11" ktor = "2.3.12" [libraries] +gradle-simple = { module = "com.github.jitpack:gradle-simple", version.ref = "gradle-simple" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } jetbrains-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "serialization" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 70d536a..87858cb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,6 +12,7 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven(url = "https://jitpack.io") } } diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index b792e7f..27fa1db 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -38,6 +38,8 @@ kotlin { implementation(libs.androidx.sqlite.bundled) implementation(libs.bundles.ktor) + + implementation(libs.gradle.simple) } androidMain.dependencies { // implementation(libs.ktor.client.okhttp) From 21b9ebcf22f6cd8fe1d465a217bcced0e95844a5 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Mon, 2 Dec 2024 22:04:46 +0100 Subject: [PATCH 11/81] Create jitpack.yml --- jitpack.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 jitpack.yml diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 0000000..abf68c1 --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,3 @@ +before_install: + - sdk install java 17-open + - sdk use java 17-open From 9da3511a6138a57c39adc5a9679a46e5a41990e4 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Mon, 2 Dec 2024 22:08:04 +0100 Subject: [PATCH 12/81] Update jitpack.yml --- jitpack.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/jitpack.yml b/jitpack.yml index abf68c1..efde7bf 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -1,3 +1,2 @@ -before_install: - - sdk install java 17-open - - sdk use java 17-open +jdk: + - openjdk17 From 5ac28e241ecfa0d9b5aacb85172cb202a749e68a Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Mon, 2 Dec 2024 22:13:06 +0100 Subject: [PATCH 13/81] Delete jitpack.yml --- jitpack.yml | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 jitpack.yml diff --git a/jitpack.yml b/jitpack.yml deleted file mode 100644 index efde7bf..0000000 --- a/jitpack.yml +++ /dev/null @@ -1,2 +0,0 @@ -jdk: - - openjdk17 From 7adc7e0da882d3b281232aec9192d42650975733 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Thu, 19 Dec 2024 10:28:54 +0100 Subject: [PATCH 14/81] Configuring maven-publish --- gradle/libs.versions.toml | 4 +-- shared/build.gradle.kts | 70 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 95d67e6..21354b0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,11 +1,11 @@ [versions] -agp = "8.7.2" +agp = "8.5.0" gradle-simple = "1.0" kotlin = "2.0.20" serialization = "1.7.3" kotlinx-datetime = "0.6.1" benasher44-uuid = "0.8.4" -sqlite = "2.5.0-alpha11" +sqlite = "2.5.0-alpha12" ktor = "2.3.12" [libraries] diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 27fa1db..d1fc5de 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -4,10 +4,14 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidLibrary) alias(libs.plugins.jetbrains.kotlin.serialization) + `maven-publish` } kotlin { androidTarget { + publishLibraryVariants("release") + withSourcesJar(publish = true) + compilations.all { compileTaskProvider.configure { compilerOptions { @@ -63,4 +67,70 @@ android { sourceCompatibility = JavaVersion.VERSION_18 targetCompatibility = JavaVersion.VERSION_18 } + + buildTypes { + debug { } + release { } + } + + publishing { + singleVariant("release") { + withSourcesJar() + withJavadocJar() + } + } } + +publishing.publications + .withType() + .configureEach { + groupId = "com.github.vunder" + version = "1.1.0" + + pom { + name = "dotmimsync" + description = "Android (Kotlin) port for Dotmim.Sync C# library (https://dotmimsync.readthedocs.io/)" + url = "https://github.com/vunder/dotmimsync" + + developers { + developer { + id = "vunder" + name = "Aleksei Starchikov" + email = "wp7apps@mail.ru" + } + } + + issueManagement { + system = "GitHub" + url = "https://github.com/vunder/dotmimsync/issues" + } + + scm { + url = "https://github.com/vunder/dotmimsync" + } + } + } + +publishing { + repositories { + mavenLocal() + + maven { + name = "BuildDir" + url = uri(project.layout.buildDirectory.dir("maven-repo")) + } + + maven { + name = "JitPack" + } + + maven { + name = "GitHubPackages" + url = uri("https://maven.pkg.github.com/vunder/dotmimsync") + credentials { + username = "" + password = "" + } + } + } +} \ No newline at end of file From 353c4e3dffc72c88e0b3de10fc2a8ce199ca79bf Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Thu, 19 Dec 2024 11:16:45 +0100 Subject: [PATCH 15/81] Update build-linux.yml --- .github/workflow/build-linux.yml | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/.github/workflow/build-linux.yml b/.github/workflow/build-linux.yml index b43c68a..849eed1 100644 --- a/.github/workflow/build-linux.yml +++ b/.github/workflow/build-linux.yml @@ -1,28 +1,32 @@ -name: Build Linux +name: Android CI on: push: - branches: [ "master" ] - paths-ignore: - - "**/*.md" - pull_request: - branches: [ "master" ] - paths-ignore: - - "**/*.md" jobs: build: + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: set up JDK 17 + - name: set up JDK uses: actions/setup-java@v4 with: - java-version: 17 - distribution: corretto + java-version: '18' + distribution: 'temurin' +# cache: gradle - - name: Linux build + - name: Install SDKMAN + run: | + curl -s "https://get.sdkman.io" | bash + source "/home/runner/.sdkman/bin/sdkman-init.sh" + sdk install gradle 8.5 +# - name: Gradle wrapper +# run: gradle wrapper --gradle-version 8.5 + - name: Grant execute permission for gradlew run: chmod +x gradlew + - name: Gradle wrapper + run: gradle wrapper --gradle-version 8.5.0 --distribution-type bin --gradle-distribution-url https://services.gradle.org/distributions/gradle-8.5-bin.zip - name: Build with Gradle run: ./gradlew build From 2a0ca761f0f8265e64e58498312e49dcae5d94c4 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Mon, 23 Dec 2024 20:19:38 +0100 Subject: [PATCH 16/81] Update DotmimServiceImpl.kt --- .../com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt index 3eca671..b9f06e8 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt @@ -149,7 +149,7 @@ internal class DotmimServiceImpl( if (request.body is OutgoingContent.ByteArrayContent) { val bytes = (request.body as OutgoingContent.ByteArrayContent).bytes() val digest = md.digest(bytes) - val hash = Base64.encode(digest) + val hash = digest.encodeBase64() request.headers.append("dotmim-sync-hash", hash) } execute(request) From 4c1687177287a1e40b18c5daa8e34760cdd3a567 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sat, 28 Dec 2024 08:34:11 +0100 Subject: [PATCH 17/81] kotlin.uuid --- gradle/libs.versions.toml | 2 -- shared/build.gradle.kts | 1 - .../com/mimetis/dotmim/sync/DbSyncAdapter.kt | 4 +++- .../mimetis/dotmim/sync/PrimitiveSerializer.kt | 18 ++++++++++++++++-- .../com/mimetis/dotmim/sync/SyncAgent.kt | 6 ++++-- .../com/mimetis/dotmim/sync/SyncContext.kt | 9 +++++---- .../com/mimetis/dotmim/sync/SyncResult.kt | 5 +++-- .../mimetis/dotmim/sync/SyncTypeConverter.kt | 6 ++++-- .../com/mimetis/dotmim/sync/UUIDSerializer.kt | 8 +++++--- .../dotmim/sync/args/ApplyChangesFailedArgs.kt | 5 +++-- .../dotmim/sync/args/SessionBeginArgs.kt | 2 ++ .../mimetis/dotmim/sync/args/SessionEndArgs.kt | 2 ++ .../com/mimetis/dotmim/sync/batch/BatchInfo.kt | 16 +++++++++------- .../dotmim/sync/builders/DbScopeBuilder.kt | 5 +++-- .../sync/messages/MessageApplyChanges.kt | 5 +++-- .../sync/messages/MessageGetChangesBatch.kt | 5 +++-- .../sync/orchestrators/BaseOrchestrator.kt | 10 +++++----- .../sync/orchestrators/LocalOrchestrator.kt | 6 ++++-- .../mimetis/dotmim/sync/scopes/ScopeInfo.kt | 11 ++++++----- .../dotmim/sync/serialization/DmUtils.kt | 6 ++++-- .../mimetis/dotmim/sync/set/ContainerTable.kt | 10 ++++++---- .../com/mimetis/dotmim/sync/set/SyncColumn.kt | 8 +++++--- .../dotmim/sync/sqlite/SqliteQueryWrapper.kt | 6 ++++-- .../dotmim/sync/sqlite/SqliteScopeBuilder.kt | 11 ++++++----- .../dotmim/sync/sqlite/SqliteSyncAdapter.kt | 6 ++++-- .../sync/web/client/DotmimServiceImpl.kt | 3 ++- .../sync/web/client/WebClientOrchestrator.kt | 8 +++++--- 27 files changed, 116 insertions(+), 68 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 21354b0..41ed72b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,6 @@ gradle-simple = "1.0" kotlin = "2.0.20" serialization = "1.7.3" kotlinx-datetime = "0.6.1" -benasher44-uuid = "0.8.4" sqlite = "2.5.0-alpha12" ktor = "2.3.12" @@ -17,7 +16,6 @@ jetbrains-serialization-core-jvm = { module = "org.jetbrains.kotlinx:kotlinx-ser jetbrains-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" } -kotlinx-uuid = { module = "com.benasher44:uuid", version.ref = "benasher44-uuid" } #androidx-sqlite = { module = "androidx.sqlite:sqlite", version.ref = "sqlite" } #androidx-sqlite-ktx = { module = "androidx.sqlite:sqlite-ktx", version.ref = "sqlite" } diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index d1fc5de..fded381 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -38,7 +38,6 @@ kotlin { implementation(libs.jetbrains.serialization.json) // implementation(libs.jetbrains.serialization.core.jvm) implementation(libs.kotlinx.datetime) - implementation(libs.kotlinx.uuid) implementation(libs.androidx.sqlite.bundled) implementation(libs.bundles.ktor) diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt index 4bb1430..16e8ae8 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt @@ -1,13 +1,15 @@ package com.mimetis.dotmim.sync import android.database.Cursor -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.set.SyncRow import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.set.SyncTable import com.mimetis.dotmim.sync.setup.SyncSetup import java.io.Closeable +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) abstract class DbSyncAdapter( val tableDescription: SyncTable, val setup: SyncSetup diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt index 58bdc27..28f57c5 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt @@ -1,7 +1,6 @@ package com.mimetis.dotmim.sync import android.util.Base64 -import com.benasher44.uuid.Uuid import kotlinx.datetime.LocalDateTime import kotlinx.datetime.format import kotlinx.datetime.format.byUnicodePattern @@ -13,8 +12,23 @@ import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.buildSerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.json.* +import kotlinx.serialization.json.JsonDecoder +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.boolean +import kotlinx.serialization.json.booleanOrNull +import kotlinx.serialization.json.double +import kotlinx.serialization.json.doubleOrNull +import kotlinx.serialization.json.float +import kotlinx.serialization.json.floatOrNull +import kotlinx.serialization.json.int +import kotlinx.serialization.json.intOrNull +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.long +import kotlinx.serialization.json.longOrNull +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) @ExperimentalSerializationApi object PrimitiveSerializer : KSerializer { private val dateFormat = LocalDateTime.Format { byUnicodePattern("yyyy-MM-dd'T'HH:mm:ss") } diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt index 8aa06c2..0a8356f 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt @@ -1,7 +1,6 @@ package com.mimetis.dotmim.sync import android.util.Log -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.args.ProgressArgs import com.mimetis.dotmim.sync.enumerations.ConflictResolutionPolicy import com.mimetis.dotmim.sync.enumerations.SyncProvision @@ -13,7 +12,10 @@ import com.mimetis.dotmim.sync.scopes.ServerScopeInfo import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.setup.SyncSetup import java.util.* +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) class SyncAgent( clientProvider: CoreProvider, val remoteOrchestrator: RemoteOrchestrator, @@ -30,7 +32,7 @@ class SyncAgent( var completeTime = utcNow() val context = SyncContext( - sessionId = Uuid.randomUUID(), + sessionId = Uuid.random(), scopeName = this.scopeName, parameters = this.parameters, syncType = syncType diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt index fc53ea7..d2a23d5 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt @@ -1,14 +1,15 @@ package com.mimetis.dotmim.sync -import com.benasher44.uuid.Uuid -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable import com.mimetis.dotmim.sync.enumerations.SyncStage import com.mimetis.dotmim.sync.enumerations.SyncType import com.mimetis.dotmim.sync.enumerations.SyncWay import com.mimetis.dotmim.sync.parameter.SyncParameters -import java.util.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) @Serializable class SyncContext( @SerialName("id") diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt index d70c32a..fb830b2 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt @@ -1,16 +1,17 @@ package com.mimetis.dotmim.sync -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.messages.DatabaseChangesApplied import com.mimetis.dotmim.sync.messages.DatabaseChangesSelected import kotlinx.serialization.Serializable -import java.util.* import kotlin.math.max +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid /** * Context of the current Sync session * Encapsulates data changes and metadata for a synchronization session. */ +@OptIn(ExperimentalUuidApi::class) @Serializable class SyncResult( /** diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt index 78e73f4..919baba 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt @@ -1,9 +1,11 @@ package com.mimetis.dotmim.sync -import com.benasher44.uuid.Uuid import java.math.BigDecimal -import java.util.* +import java.util.Date +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) object SyncTypeConverter { fun tryConvertTo(value: Any?): T? { if (value == null) diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt index 86be752..6b30dc3 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt @@ -1,17 +1,19 @@ package com.mimetis.dotmim.sync -import com.benasher44.uuid.Uuid import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) object UUIDSerializer : KSerializer { - override val descriptor = PrimitiveSerialDescriptor("com.mimetis.dotmim.sync-com.benasher44.uuid.Uuid", PrimitiveKind.STRING) + override val descriptor = PrimitiveSerialDescriptor("com.mimetis.dotmim.sync-kotlin.uuid.Uuid", PrimitiveKind.STRING) override fun deserialize(decoder: Decoder): Uuid { - return Uuid.fromString(decoder.decodeString()) + return Uuid.parse(decoder.decodeString()) } override fun serialize(encoder: Encoder, value: Uuid) { diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt index 5ad47a2..1f7b708 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt @@ -1,16 +1,17 @@ package com.mimetis.dotmim.sync.args -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.SyncConflict import com.mimetis.dotmim.sync.SyncContext import com.mimetis.dotmim.sync.enumerations.ConflictResolution import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.SyncRow -import java.util.* +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid /** * Raised as an argument when an apply is failing. Waiting from user for the conflict resolution */ +@OptIn(ExperimentalUuidApi::class) class ApplyChangesFailedArgs( context: SyncContext, diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionBeginArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionBeginArgs.kt index 9cd12dc..8591231 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionBeginArgs.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionBeginArgs.kt @@ -2,10 +2,12 @@ package com.mimetis.dotmim.sync.args import com.mimetis.dotmim.sync.SyncContext import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator +import kotlin.uuid.ExperimentalUuidApi /** * Event args generated during BeginSession stage */ +@OptIn(ExperimentalUuidApi::class) class SessionBeginArgs( context: SyncContext ) : ProgressArgs(context) { diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionEndArgs.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionEndArgs.kt index e2d3e57..23b6a97 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionEndArgs.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionEndArgs.kt @@ -2,10 +2,12 @@ package com.mimetis.dotmim.sync.args import com.mimetis.dotmim.sync.SyncContext import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator +import kotlin.uuid.ExperimentalUuidApi /** * Event args generated during EndSession stage */ +@OptIn(ExperimentalUuidApi::class) class SessionEndArgs( context: SyncContext ) : ProgressArgs(context) { diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt index bd33f4a..5aa0865 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt @@ -1,17 +1,18 @@ package com.mimetis.dotmim.sync.batch -import com.benasher44.uuid.Uuid -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient import com.mimetis.dotmim.sync.DbSyncAdapter import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.set.SyncTable +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import java.io.File import java.text.SimpleDateFormat -import java.util.* -import kotlin.collections.ArrayList +import java.util.Calendar +import java.util.Locale +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid /** * Represents a Batch, containing a full or serialized change set @@ -270,6 +271,7 @@ class BatchInfo() { } + @OptIn(ExperimentalUuidApi::class) companion object { /** * generate a batch file name @@ -283,7 +285,7 @@ class BatchInfo() { else -> throw Exception("OverflowException: too much batches !!!") } - return "${index}_${Uuid.randomUUID().toString().replace(".", "_")}.batch" + return "${index}_${Uuid.random().toString().replace(".", "_")}.batch" } } } diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt index 14c8f2f..1be8e2b 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt @@ -1,9 +1,10 @@ package com.mimetis.dotmim.sync.builders -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.scopes.ScopeInfo -import java.util.* +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) abstract class DbScopeBuilder( scopeInfoTableName: String ) { diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt index 1ae545a..ae501ff 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt @@ -1,15 +1,16 @@ package com.mimetis.dotmim.sync.messages -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.batch.BatchInfo import com.mimetis.dotmim.sync.enumerations.ConflictResolutionPolicy import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.setup.SyncSetup -import java.util.* +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid /** * Message exchanged during the Begin session sync stage */ +@OptIn(ExperimentalUuidApi::class) class MessageApplyChanges( /** * Gets the local Scope Id diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt index 25e2efb..b363560 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt @@ -1,13 +1,14 @@ package com.mimetis.dotmim.sync.messages -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.setup.SyncSetup -import java.util.* +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid /** * Message exchanged during the Get Changes Batch sync stage */ +@OptIn(ExperimentalUuidApi::class) class MessageGetChangesBatch( /** * Gets or Sets the Scope Id that should be excluded when we get lines from the local store diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt index 4c82074..bd6ed7a 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt @@ -1,7 +1,6 @@ package com.mimetis.dotmim.sync.orchestrators import android.database.Cursor -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.* import com.mimetis.dotmim.sync.args.* import com.mimetis.dotmim.sync.batch.BatchInfo @@ -19,9 +18,10 @@ import com.mimetis.dotmim.sync.setup.SyncSetup import com.mimetis.dotmim.sync.sqlite.CursorHelper.getValue import java.io.File import java.util.* -import kotlin.collections.ArrayList -import kotlin.collections.HashSet +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) abstract class BaseOrchestrator( /** * Gets or Sets the provider used by this local orchestrator @@ -81,7 +81,7 @@ abstract class BaseOrchestrator( open fun getContext(): SyncContext { return syncContext ?: SyncContext( - sessionId = Uuid.randomUUID(), + sessionId = Uuid.random(), scopeName = this.scopeName ) } @@ -318,7 +318,7 @@ abstract class BaseOrchestrator( val scopes = scopeBuilder.getAllScopes(scopeName) if (scopes.isEmpty()) { var scope = ScopeInfo( - id = Uuid.randomUUID(), + id = Uuid.random(), name = scopeName, isNewScope = true, lastSync = null, diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt index 8c234ac..1046641 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt @@ -1,6 +1,5 @@ package com.mimetis.dotmim.sync.orchestrators -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.* import com.mimetis.dotmim.sync.SyncVersion.major import com.mimetis.dotmim.sync.SyncVersion.toVersionInt @@ -20,7 +19,10 @@ import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.set.SyncTable import com.mimetis.dotmim.sync.setup.SyncSetup import java.util.* +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) class LocalOrchestrator( provider: CoreProvider, options: SyncOptions, @@ -306,7 +308,7 @@ class LocalOrchestrator( // Create the message containing everything needed to apply changes val applyChanges = MessageApplyChanges( scope.id, - Uuid.fromString("00000000-0000-0000-0000-000000000000"), + Uuid.NIL, isNew, lastSyncTS, schema, diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt index fc0abb7..c688677 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt @@ -1,17 +1,18 @@ package com.mimetis.dotmim.sync.scopes -import com.benasher44.uuid.Uuid -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient import com.mimetis.dotmim.sync.UUIDSerializer import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.setup.SyncSetup -import java.util.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid /** * Mapping sur la table ScopeInfo */ +@OptIn(ExperimentalUuidApi::class) @Serializable class ScopeInfo( /** diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt index a38e70f..f6afb7f 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt @@ -1,9 +1,11 @@ package com.mimetis.dotmim.sync.serialization -import com.benasher44.uuid.Uuid import java.math.BigDecimal -import java.util.* +import java.util.Date +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) object DmUtils { fun getAssemblyQualifiedName(valueType: Class<*>): String = when (valueType) { diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt index 8d77316..5c1d3d5 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt @@ -1,12 +1,13 @@ package com.mimetis.dotmim.sync.set -import com.benasher44.uuid.Uuid -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable import com.mimetis.dotmim.sync.PrimitiveSerializer import com.mimetis.dotmim.sync.serialization.DmUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable import java.math.BigDecimal -import java.util.* +import java.util.Date +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid @Serializable class ContainerTable( @@ -28,6 +29,7 @@ class ContainerTable( override fun getAllNamesProperties(): List = listOf(tableName, schemaName) + @OptIn(ExperimentalUuidApi::class) companion object { /** * Calculate an estimation of the dictionary values size diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt index 25bde7d..d52382e 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt @@ -1,12 +1,14 @@ package com.mimetis.dotmim.sync.set -import com.benasher44.uuid.Uuid +import com.mimetis.dotmim.sync.setup.DbType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import com.mimetis.dotmim.sync.setup.DbType import java.math.BigDecimal -import java.util.* +import java.util.Date +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) @Serializable class SyncColumn( @SerialName("n") diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt index a2cb8a2..b2f2974 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt @@ -3,11 +3,12 @@ package com.mimetis.dotmim.sync.sqlite import android.database.Cursor import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteStatement -import com.benasher44.uuid.Uuid import java.io.Closeable import java.math.BigDecimal import java.text.SimpleDateFormat -import java.util.* +import java.util.Date +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid /** * Wrapper to cache sql-query building and executing process @@ -30,6 +31,7 @@ import java.util.* * @param dateFormat SimpleDateFormat instance to format Date values * @param queryBuilder Function to form sql query. Called only once on the first call */ +@OptIn(ExperimentalUuidApi::class) class SqliteQueryWrapper( private val database: SQLiteDatabase, private val dateFormat: SimpleDateFormat, diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt index 218084d..992e633 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt @@ -2,17 +2,18 @@ package com.mimetis.dotmim.sync.sqlite import android.database.Cursor import android.database.sqlite.SQLiteDatabase -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.SyncVersion -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json import com.mimetis.dotmim.sync.builders.DbScopeBuilder import com.mimetis.dotmim.sync.scopes.ScopeInfo import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.setup.SyncSetup +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import java.util.* -import kotlin.collections.ArrayList +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) class SqliteScopeBuilder( scopeInfoTableName: String, private val database: SQLiteDatabase @@ -128,7 +129,7 @@ class SqliteScopeBuilder( private fun readScope(cursor: Cursor, json: Json) = ScopeInfo( - id = Uuid.fromString(cursor.getString(cursor.getColumnIndex("sync_scope_id"))), + id = Uuid.parse(cursor.getString(cursor.getColumnIndex("sync_scope_id"))), name = cursor.getString(cursor.getColumnIndex("sync_scope_name")), schema = if (cursor.isNull(cursor.getColumnIndex("sync_scope_schema"))) null else json.decodeFromString( cursor.getString(cursor.getColumnIndex("sync_scope_schema")) diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt index 7577889..6a254fd 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt @@ -4,7 +4,6 @@ import android.database.Cursor import android.database.sqlite.SQLiteDatabase import android.os.Build import android.util.Base64 -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.DbSyncAdapter import com.mimetis.dotmim.sync.builders.ParserName import com.mimetis.dotmim.sync.set.SyncColumn @@ -13,8 +12,11 @@ import com.mimetis.dotmim.sync.set.SyncTable import com.mimetis.dotmim.sync.setup.DbType import com.mimetis.dotmim.sync.setup.SyncSetup import java.text.SimpleDateFormat -import java.util.* +import java.util.Locale +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) class SqliteSyncAdapter( tableDescription: SyncTable, private val tableName: ParserName, diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt index b9f06e8..0a34452 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt @@ -15,8 +15,9 @@ import io.ktor.http.contentType import java.security.MessageDigest import kotlin.io.encoding.Base64 import kotlin.io.encoding.ExperimentalEncodingApi +import kotlin.uuid.ExperimentalUuidApi -@OptIn(ExperimentalEncodingApi::class) +@OptIn(ExperimentalEncodingApi::class, ExperimentalUuidApi::class) internal class DotmimServiceImpl( serviceAddress: String, val client: HttpClient diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt index b0e8373..20d8bd1 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt @@ -1,7 +1,6 @@ package com.mimetis.dotmim.sync.web.client import android.util.Log -import com.benasher44.uuid.Uuid import com.mimetis.dotmim.sync.* import com.mimetis.dotmim.sync.args.* import com.mimetis.dotmim.sync.batch.BatchInfo @@ -23,7 +22,10 @@ import java.io.File import java.net.URL import java.text.SimpleDateFormat import java.util.* +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid +@OptIn(ExperimentalUuidApi::class) class WebClientOrchestrator( private val serviceAddress: String, client: HttpClient, @@ -132,7 +134,7 @@ class WebClientOrchestrator( val batchDirectoryRoot = this.options.batchDirectory val batchDirectoryName = SimpleDateFormat("yyyy_MM_dd_ss", Locale.getDefault()).format( Calendar.getInstance(Locale.getDefault()).time - ) + Uuid.randomUUID().toString().replace(".", "") + ) + Uuid.random().toString().replace(".", "") val batchDirectoryFullPath = File(batchDirectoryRoot, batchDirectoryName).absolutePath // Create the BatchInfo serialized (forced because in a snapshot call, so we are obviously serialized on disk) @@ -409,7 +411,7 @@ class WebClientOrchestrator( val batchDirectoryRoot = this.options.batchDirectory val batchDirectoryName = SimpleDateFormat("yyyy_MM_dd_ss", Locale.getDefault()).format( Calendar.getInstance(Locale.getDefault()).time - ) + Uuid.randomUUID().toString().replace(".", "") + ) + Uuid.random().toString().replace(".", "") serverBatchInfo.directoryRoot = batchDirectoryRoot serverBatchInfo.directoryName = batchDirectoryName From 306e8b4a4a034f165abf8d4d1b992167e2a3a73b Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Tue, 31 Dec 2024 11:08:10 +0100 Subject: [PATCH 18/81] Merge fix --- .../com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt index 0a34452..f0dd44b 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt @@ -12,12 +12,11 @@ import io.ktor.http.ContentType import io.ktor.http.HttpHeaders import io.ktor.http.content.OutgoingContent import io.ktor.http.contentType +import io.ktor.util.encodeBase64 import java.security.MessageDigest -import kotlin.io.encoding.Base64 -import kotlin.io.encoding.ExperimentalEncodingApi import kotlin.uuid.ExperimentalUuidApi -@OptIn(ExperimentalEncodingApi::class, ExperimentalUuidApi::class) +@OptIn(ExperimentalUuidApi::class) internal class DotmimServiceImpl( serviceAddress: String, val client: HttpClient From 801f8b6fa86edea9866454be38af2bafc0f5d084 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Wed, 1 Jan 2025 16:01:23 +0100 Subject: [PATCH 19/81] Minor project changes --- README.md | 2 +- shared/build.gradle.kts | 12 ++++-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 3aac6ff..7cf9cfc 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ To use library in your app add link to JitPack repo and add library dependency to your app build.gradle ```gradle dependencies { - implementation 'com.github.vunder:dotmimsync:VERSION' + implementation 'io.github.vunder:dotmimsync:VERSION' } ``` diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index fded381..11f9cc9 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -83,7 +83,7 @@ android { publishing.publications .withType() .configureEach { - groupId = "com.github.vunder" + groupId = "io.github.vunder" version = "1.1.0" pom { @@ -95,7 +95,7 @@ publishing.publications developer { id = "vunder" name = "Aleksei Starchikov" - email = "wp7apps@mail.ru" + email = "aleksei.starchikov@outlook.com" } } @@ -112,15 +112,11 @@ publishing.publications publishing { repositories { - mavenLocal() +// mavenLocal() maven { name = "BuildDir" - url = uri(project.layout.buildDirectory.dir("maven-repo")) - } - - maven { - name = "JitPack" + url = uri(rootProject.layout.buildDirectory.dir("maven-repo")) } maven { From 04b08225ca7eb631075998ff87d59597e7d61eef Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Wed, 1 Jan 2025 16:03:26 +0100 Subject: [PATCH 20/81] Ktor library update to 3.0.3 Updated README --- README.md | 9 +-------- gradle/libs.versions.toml | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7cf9cfc..132148e 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ To use library in your app add link to JitPack repo allprojects { repositories { ... - maven { url 'https://jitpack.io' } + mavenCentral() } } ``` @@ -24,13 +24,6 @@ and add library dependency to your app build.gradle } ``` -Also it is necessary to add this dependency to make library work correctly with http-session. You can use newer version in case it is available -```gradle - dependencies { - implementation 'com.squareup.okhttp3:okhttp-urlconnection:5.0.0-alpha.2' - } -``` - ## Library usage General use-cases you can find in original library documentation diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 41ed72b..7343525 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ kotlin = "2.0.20" serialization = "1.7.3" kotlinx-datetime = "0.6.1" sqlite = "2.5.0-alpha12" -ktor = "2.3.12" +ktor = "3.0.3" [libraries] gradle-simple = { module = "com.github.jitpack:gradle-simple", version.ref = "gradle-simple" } From 5eb30df24f8a0d89d52f202ebbb26d24c1fa61a3 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Wed, 1 Jan 2025 16:12:03 +0100 Subject: [PATCH 21/81] Added missing Ktor client libraries --- gradle/libs.versions.toml | 2 ++ shared/build.gradle.kts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7343525..6922f44 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,8 +21,10 @@ kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version. #androidx-sqlite-ktx = { module = "androidx.sqlite:sqlite-ktx", version.ref = "sqlite" } androidx-sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" } +ktor-client-darwin = { module = "io.ktor:ktor-client-darvin", version.ref = "ktor" } ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } +ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } [plugins] diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 11f9cc9..6607d15 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -45,10 +45,10 @@ kotlin { implementation(libs.gradle.simple) } androidMain.dependencies { -// implementation(libs.ktor.client.okhttp) + implementation(libs.ktor.client.okhttp) } iosMain.dependencies { -// implementation(libs.ktor.client.darwin) + implementation(libs.ktor.client.darwin) } commonTest.dependencies { implementation(libs.kotlin.test) From 2148ae95518ed4b5da6f829cfe614c1920093654 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Wed, 1 Jan 2025 16:36:18 +0100 Subject: [PATCH 22/81] Added license file Added publising o Maven Central --- LICENSE | 4 ++-- shared/build.gradle.kts | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 78ca603..b15e087 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 Alexey Starchikov +Copyright (c) 2021 Aleksei Starchikov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +SOFTWARE. \ No newline at end of file diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 6607d15..14dc6e8 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -1,3 +1,4 @@ +import com.vanniktech.maven.publish.SonatypeHost import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -5,9 +6,12 @@ plugins { alias(libs.plugins.androidLibrary) alias(libs.plugins.jetbrains.kotlin.serialization) `maven-publish` + id("com.vanniktech.maven.publish") version "0.30.0" } kotlin { +// jvm() + androidTarget { publishLibraryVariants("release") withSourcesJar(publish = true) @@ -91,6 +95,14 @@ publishing.publications description = "Android (Kotlin) port for Dotmim.Sync C# library (https://dotmimsync.readthedocs.io/)" url = "https://github.com/vunder/dotmimsync" + licenses { + license { + name = "MIT License" + url = "https://mit-license.org/" + distribution = "https://mit-license.org/" + } + } + developers { developer { id = "vunder" @@ -128,4 +140,9 @@ publishing { } } } +} + +mavenPublishing { + publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL, automaticRelease = false) + signAllPublications() } \ No newline at end of file From b182b8c16359da6b3d052e336721f760717f9a6f Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Wed, 1 Jan 2025 16:45:02 +0100 Subject: [PATCH 23/81] Updated ignores --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9872784..f841121 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,6 @@ captures .cxx local.properties xcuserdata -.kotlin \ No newline at end of file +.kotlin +/release.sh +/publish-snapshot.sh From 0eb0a1b82be3ad51551e44f7fbe937fe93066adf Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Wed, 1 Jan 2025 17:13:08 +0100 Subject: [PATCH 24/81] Removed GitHub Actions workflow Updated ignores --- .github/workflow/build-linux.yml | 32 -------------------------------- .gitignore | 5 +++-- 2 files changed, 3 insertions(+), 34 deletions(-) delete mode 100644 .github/workflow/build-linux.yml diff --git a/.github/workflow/build-linux.yml b/.github/workflow/build-linux.yml deleted file mode 100644 index 849eed1..0000000 --- a/.github/workflow/build-linux.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Android CI - -on: - push: - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: set up JDK - uses: actions/setup-java@v4 - with: - java-version: '18' - distribution: 'temurin' -# cache: gradle - - - name: Install SDKMAN - run: | - curl -s "https://get.sdkman.io" | bash - source "/home/runner/.sdkman/bin/sdkman-init.sh" - sdk install gradle 8.5 -# - name: Gradle wrapper -# run: gradle wrapper --gradle-version 8.5 - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Gradle wrapper - run: gradle wrapper --gradle-version 8.5.0 --distribution-type bin --gradle-distribution-url https://services.gradle.org/distributions/gradle-8.5-bin.zip - - name: Build with Gradle - run: ./gradlew build diff --git a/.gitignore b/.gitignore index f841121..012ae8e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,6 @@ captures local.properties xcuserdata .kotlin -/release.sh -/publish-snapshot.sh +/publish-and-release.sh +/snapshot.sh +/publish-only.sh From b7ac4d5405a96f09558df6523e9d2331a2a015c4 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Wed, 1 Jan 2025 17:16:00 +0100 Subject: [PATCH 25/81] Renamed serialized class --- .../commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt | 4 ++-- .../commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt | 2 +- .../dotmim/sync/{UUIDSerializer.kt => UuidSerializer.kt} | 2 +- .../kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) rename shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/{UUIDSerializer.kt => UuidSerializer.kt} (94%) diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt index d2a23d5..95f9024 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt @@ -13,14 +13,14 @@ import kotlin.uuid.Uuid @Serializable class SyncContext( @SerialName("id") - @Serializable(with = UUIDSerializer::class) + @Serializable(with = UuidSerializer::class) var sessionId: Uuid, @SerialName("sn") var scopeName: String, @SerialName("csid") - @Serializable(with = UUIDSerializer::class) + @Serializable(with = UuidSerializer::class) var clientScopeId: Uuid? = null, @SerialName("typ") diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt index fb830b2..ec82ea0 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt @@ -17,7 +17,7 @@ class SyncResult( /** * Current Session, in progress */ - @Serializable(with = UUIDSerializer::class) + @Serializable(with = UuidSerializer::class) var sessionId: Uuid, /** diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UuidSerializer.kt similarity index 94% rename from shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt rename to shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UuidSerializer.kt index 6b30dc3..623324c 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UUIDSerializer.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/UuidSerializer.kt @@ -9,7 +9,7 @@ import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @OptIn(ExperimentalUuidApi::class) -object UUIDSerializer : KSerializer { +object UuidSerializer : KSerializer { override val descriptor = PrimitiveSerialDescriptor("com.mimetis.dotmim.sync-kotlin.uuid.Uuid", PrimitiveKind.STRING) override fun deserialize(decoder: Decoder): Uuid { diff --git a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt index c688677..a5e9ae3 100644 --- a/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt +++ b/shared/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt @@ -1,6 +1,6 @@ package com.mimetis.dotmim.sync.scopes -import com.mimetis.dotmim.sync.UUIDSerializer +import com.mimetis.dotmim.sync.UuidSerializer import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.setup.SyncSetup import kotlinx.serialization.SerialName @@ -25,7 +25,7 @@ class ScopeInfo( * Id of the scope owner */ @SerialName("id") - @Serializable(with = UUIDSerializer::class) + @Serializable(with = UuidSerializer::class) var id: Uuid, /** From 77b095a574c66872a7c5df339bd658d90d3fba99 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Wed, 1 Jan 2025 17:39:27 +0100 Subject: [PATCH 26/81] Fixed artifact groupId --- settings.gradle.kts | 1 - shared/build.gradle.kts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 87858cb..0481d6f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,7 +4,6 @@ pluginManagement { google() gradlePluginPortal() mavenCentral() - maven(url = "https://jitpack.io") } } diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 14dc6e8..cc99447 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -87,7 +87,7 @@ android { publishing.publications .withType() .configureEach { - groupId = "io.github.vunder" + groupId = "io.github.vunder.dotmimsync" version = "1.1.0" pom { From e9d9036871c8c95857d732c4c69fa246b43f7df0 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Wed, 1 Jan 2025 21:22:23 +0100 Subject: [PATCH 27/81] Updated library namespace --- .idea/gradle.xml | 2 +- README.md | 2 +- {shared => dotmimsync-core}/build.gradle.kts | 0 .../kotlin/com/mimetis/dotmimsync/Platform.android.kt | 0 .../kotlin/com/mimetis/dotmim/sync/ArrayListLikeSerializer.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/CoreProvider.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/DataRowState.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt | 0 .../src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt | 0 .../com/mimetis/dotmim/sync/MissingClientScopeInfoException.kt | 0 .../kotlin/com/mimetis/dotmim/sync/MissingColumnException.kt | 0 .../kotlin/com/mimetis/dotmim/sync/MissingFileException.kt | 0 .../dotmim/sync/MissingLocalOrchestratorSchemaException.kt | 0 .../com/mimetis/dotmim/sync/MissingPrimaryKeyColumnException.kt | 0 .../com/mimetis/dotmim/sync/MissingPrimaryKeyException.kt | 0 .../kotlin/com/mimetis/dotmim/sync/MissingTableException.kt | 0 .../kotlin/com/mimetis/dotmim/sync/MissingTablesException.kt | 0 .../com/mimetis/dotmim/sync/MissingTrackingTableException.kt | 0 .../kotlin/com/mimetis/dotmim/sync/MissingsColumnException.kt | 0 .../kotlin/com/mimetis/dotmim/sync/OutOfDateException.kt | 0 .../src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt | 0 .../kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt | 0 .../src/commonMain/kotlin/com/mimetis/dotmim/sync/Progress.kt | 0 .../kotlin/com/mimetis/dotmim/sync/RollbackException.kt | 0 .../kotlin/com/mimetis/dotmim/sync/RowOverSizedException.kt | 0 .../src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/SyncConflict.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/SyncOptions.kt | 0 .../src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt | 0 .../kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/SyncVersion.kt | 0 .../src/commonMain/kotlin/com/mimetis/dotmim/sync/Tuple.kt | 0 .../kotlin/com/mimetis/dotmim/sync/UnknownException.kt | 0 .../com/mimetis/dotmim/sync/UnsupportedColumnTypeException.kt | 0 .../dotmim/sync/UnsupportedPrimaryKeyColumnNameException.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/UuidSerializer.kt | 0 .../com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt | 0 .../com/mimetis/dotmim/sync/args/DatabaseChangesAppliedArgs.kt | 0 .../com/mimetis/dotmim/sync/args/DatabaseChangesSelectedArgs.kt | 0 .../mimetis/dotmim/sync/args/DatabaseChangesSelectingArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/DeprovisionedArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/DeprovisioningArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt | 0 .../com/mimetis/dotmim/sync/args/HttpBatchesDownloadedArgs.kt | 0 .../com/mimetis/dotmim/sync/args/HttpBatchesDownloadingArgs.kt | 0 .../mimetis/dotmim/sync/args/HttpGettingSchemaRequestArgs.kt | 0 .../mimetis/dotmim/sync/args/HttpGettingSchemaResponseArgs.kt | 0 .../com/mimetis/dotmim/sync/args/HttpGettingScopeRequestArgs.kt | 0 .../dotmim/sync/args/HttpGettingServerChangesRequestArgs.kt | 0 .../dotmim/sync/args/HttpGettingServerChangesResponseArgs.kt | 0 .../dotmim/sync/args/HttpSendingClientChangesRequestArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/OutdatedArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/ProgressArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/ProvisionedArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/SchemaLoadedArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/SchemaLoadingArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/ScopeSavedArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/ScopeSavingArgs.kt | 0 .../com/mimetis/dotmim/sync/args/ScopeTableCreatedArgs.kt | 0 .../com/mimetis/dotmim/sync/args/ScopeTableCreatingArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/SerializingSetArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/SessionBeginArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/args/SessionEndArgs.kt | 0 .../com/mimetis/dotmim/sync/args/TableChangesAppliedArgs.kt | 0 .../com/mimetis/dotmim/sync/args/TableChangesApplyingArgs.kt | 0 .../mimetis/dotmim/sync/args/TableChangesBatchAppliedArgs.kt | 0 .../mimetis/dotmim/sync/args/TableChangesBatchApplyingArgs.kt | 0 .../com/mimetis/dotmim/sync/args/TableChangesSelectedArgs.kt | 0 .../com/mimetis/dotmim/sync/args/TableChangesSelectingArgs.kt | 0 .../kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt | 0 .../kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt | 0 .../kotlin/com/mimetis/dotmim/sync/batch/BatchPartTableInfo.kt | 0 .../kotlin/com/mimetis/dotmim/sync/builders/DbBuilder.kt | 0 .../kotlin/com/mimetis/dotmim/sync/builders/DbMetadata.kt | 0 .../kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt | 0 .../kotlin/com/mimetis/dotmim/sync/builders/DbScopeType.kt | 0 .../com/mimetis/dotmim/sync/builders/DbStoredProcedureType.kt | 0 .../kotlin/com/mimetis/dotmim/sync/builders/DbTableBuilder.kt | 0 .../kotlin/com/mimetis/dotmim/sync/builders/DbTriggerType.kt | 0 .../kotlin/com/mimetis/dotmim/sync/builders/GlobalParser.kt | 0 .../kotlin/com/mimetis/dotmim/sync/builders/ParserName.kt | 0 .../kotlin/com/mimetis/dotmim/sync/builders/ParserString.kt | 0 .../kotlin/com/mimetis/dotmim/sync/data/EnumByNameSerializer.kt | 0 .../com/mimetis/dotmim/sync/data/EnumByValueSerializer.kt | 0 .../kotlin/com/mimetis/dotmim/sync/data/EnumWithValue.kt | 0 .../kotlin/com/mimetis/dotmim/sync/enumerations/ApplyAction.kt | 0 .../com/mimetis/dotmim/sync/enumerations/ConflictResolution.kt | 0 .../dotmim/sync/enumerations/ConflictResolutionPolicy.kt | 0 .../kotlin/com/mimetis/dotmim/sync/enumerations/ConflictType.kt | 0 .../com/mimetis/dotmim/sync/enumerations/SyncDirection.kt | 0 .../com/mimetis/dotmim/sync/enumerations/SyncProvision.kt | 0 .../kotlin/com/mimetis/dotmim/sync/enumerations/SyncStage.kt | 0 .../kotlin/com/mimetis/dotmim/sync/enumerations/SyncType.kt | 0 .../kotlin/com/mimetis/dotmim/sync/enumerations/SyncWay.kt | 0 .../com/mimetis/dotmim/sync/interceptors/ISyncInterceptor.kt | 0 .../com/mimetis/dotmim/sync/interceptors/InterceptorWrapper.kt | 0 .../kotlin/com/mimetis/dotmim/sync/interceptors/Interceptors.kt | 0 .../mimetis/dotmim/sync/manager/DbRelationColumnDefinition.kt | 0 .../com/mimetis/dotmim/sync/manager/DbRelationDefinition.kt | 0 .../com/mimetis/dotmim/sync/messages/DatabaseChangesApplied.kt | 0 .../com/mimetis/dotmim/sync/messages/DatabaseChangesSelected.kt | 0 .../mimetis/dotmim/sync/messages/DatabaseMetadatasCleaned.kt | 0 .../com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt | 0 .../com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt | 0 .../com/mimetis/dotmim/sync/messages/TableChangesApplied.kt | 0 .../com/mimetis/dotmim/sync/messages/TableChangesSelected.kt | 0 .../com/mimetis/dotmim/sync/messages/TableMetadatasCleaned.kt | 0 .../com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt | 0 .../com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt | 0 .../com/mimetis/dotmim/sync/orchestrators/RemoteOrchestrator.kt | 0 .../kotlin/com/mimetis/dotmim/sync/parameter/SyncParameter.kt | 0 .../kotlin/com/mimetis/dotmim/sync/parameter/SyncParameters.kt | 0 .../kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt | 0 .../kotlin/com/mimetis/dotmim/sync/scopes/ServerScopeInfo.kt | 0 .../kotlin/com/mimetis/dotmim/sync/serialization/Converter.kt | 0 .../kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/CompareHelper.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/ContainerSet.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/SyncColumnIdentifier.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/SyncColumns.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilter.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoin.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoins.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameter.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameters.kt | 0 .../com/mimetis/dotmim/sync/set/SyncFilterWhereSideItem.kt | 0 .../com/mimetis/dotmim/sync/set/SyncFilterWhereSideItems.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/SyncFilters.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/SyncNamedItem.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/SyncRelation.kt | 0 .../kotlin/com/mimetis/dotmim/sync/set/SyncRelations.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRows.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncSet.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncTable.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncTables.kt | 0 .../commonMain/kotlin/com/mimetis/dotmim/sync/setup/DbType.kt | 0 .../src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/Join.kt | 0 .../kotlin/com/mimetis/dotmim/sync/setup/SetupColumns.kt | 0 .../kotlin/com/mimetis/dotmim/sync/setup/SetupFilter.kt | 0 .../kotlin/com/mimetis/dotmim/sync/setup/SetupFilterJoin.kt | 0 .../com/mimetis/dotmim/sync/setup/SetupFilterParameter.kt | 0 .../kotlin/com/mimetis/dotmim/sync/setup/SetupFilterWhere.kt | 0 .../kotlin/com/mimetis/dotmim/sync/setup/SetupFilters.kt | 0 .../kotlin/com/mimetis/dotmim/sync/setup/SetupTable.kt | 0 .../kotlin/com/mimetis/dotmim/sync/setup/SetupTables.kt | 0 .../kotlin/com/mimetis/dotmim/sync/setup/SyncSetup.kt | 0 .../kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt | 0 .../kotlin/com/mimetis/dotmim/sync/sqlite/SqliteBuilder.kt | 0 .../kotlin/com/mimetis/dotmim/sync/sqlite/SqliteDbMetadata.kt | 0 .../com/mimetis/dotmim/sync/sqlite/SqliteManagementUtils.kt | 0 .../kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt | 0 .../kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt | 0 .../kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt | 0 .../kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncProvider.kt | 0 .../kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt | 0 .../kotlin/com/mimetis/dotmim/sync/sqlite/SqliteType.kt | 0 .../com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt | 0 .../com/mimetis/dotmim/sync/web/client/FancyCoreProvider.kt | 0 .../dotmim/sync/web/client/HttpMessageEnsureSchemaResponse.kt | 0 .../dotmim/sync/web/client/HttpMessageEnsureScopesRequest.kt | 0 .../dotmim/sync/web/client/HttpMessageEnsureScopesResponse.kt | 0 .../dotmim/sync/web/client/HttpMessageGetMoreChangesRequest.kt | 0 .../dotmim/sync/web/client/HttpMessageSendChangesRequest.kt | 0 .../dotmim/sync/web/client/HttpMessageSendChangesResponse.kt | 0 .../dotmim/sync/web/client/HttpMessageSummaryResponse.kt | 0 .../kotlin/com/mimetis/dotmim/sync/web/client/HttpStep.kt | 0 .../com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt | 0 .../src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt | 0 settings.gradle.kts | 2 +- 175 files changed, 3 insertions(+), 3 deletions(-) rename {shared => dotmimsync-core}/build.gradle.kts (100%) rename {shared => dotmimsync-core}/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/ArrayListLikeSerializer.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/CoreProvider.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/DataRowState.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/DbSyncAdapter.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingClientScopeInfoException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingColumnException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingFileException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingLocalOrchestratorSchemaException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingPrimaryKeyColumnException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingPrimaryKeyException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTableException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTablesException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTrackingTableException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingsColumnException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/OutOfDateException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/Progress.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/RollbackException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/RowOverSizedException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncConflict.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncOptions.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncVersion.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/Tuple.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/UnknownException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/UnsupportedColumnTypeException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/UnsupportedPrimaryKeyColumnNameException.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/UuidSerializer.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ApplyChangesFailedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DatabaseChangesAppliedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DatabaseChangesSelectedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DatabaseChangesSelectingArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisionedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisioningArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpBatchesDownloadedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpBatchesDownloadingArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingSchemaRequestArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingSchemaResponseArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingScopeRequestArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingServerChangesRequestArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpGettingServerChangesResponseArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/HttpSendingClientChangesRequestArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/OutdatedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProgressArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisionedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SchemaLoadedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SchemaLoadingArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeSavedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeSavingArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeTableCreatedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ScopeTableCreatingArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SerializingSetArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionBeginArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SessionEndArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesAppliedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesApplyingArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesBatchAppliedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesBatchApplyingArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesSelectedArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/TableChangesSelectingArgs.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartTableInfo.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbBuilder.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbMetadata.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeBuilder.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbScopeType.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbStoredProcedureType.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbTableBuilder.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbTriggerType.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/GlobalParser.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/ParserName.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/ParserString.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByNameSerializer.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByValueSerializer.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumWithValue.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ApplyAction.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ConflictResolution.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ConflictResolutionPolicy.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/ConflictType.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncDirection.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncProvision.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncStage.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncType.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncWay.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/ISyncInterceptor.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/InterceptorWrapper.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/Interceptors.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/manager/DbRelationColumnDefinition.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/manager/DbRelationDefinition.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/DatabaseChangesApplied.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/DatabaseChangesSelected.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/DatabaseMetadatasCleaned.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageApplyChanges.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/TableChangesApplied.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/TableChangesSelected.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/TableMetadatasCleaned.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/RemoteOrchestrator.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameter.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameters.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ScopeInfo.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/scopes/ServerScopeInfo.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/Converter.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/CompareHelper.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerSet.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumnIdentifier.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumns.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilter.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoin.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoins.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameter.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameters.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItem.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItems.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilters.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncNamedItem.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRelation.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRelations.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRows.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncSet.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncTable.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncTables.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/DbType.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/Join.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupColumns.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilter.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilterJoin.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilterParameter.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilterWhere.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupFilters.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupTable.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SetupTables.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/SyncSetup.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteBuilder.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteDbMetadata.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteManagementUtils.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteScopeBuilder.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncProvider.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteType.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/FancyCoreProvider.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureSchemaResponse.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesRequest.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageEnsureScopesResponse.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageGetMoreChangesRequest.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesRequest.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSendChangesResponse.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSummaryResponse.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpStep.kt (100%) rename {shared => dotmimsync-core}/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt (100%) rename {shared => dotmimsync-core}/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt (100%) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 08ea2a3..e8b7778 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -10,7 +10,7 @@

/// Normal synchronization From 9e0390ab4af6013ed95062f335509309afe5b3ee Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 09:07:57 +0200 Subject: [PATCH 41/81] Enum serialization in KMP --- .../com/mimetis/dotmim/sync/DataRowState.kt | 22 +++++++++++-- .../dotmim/sync/data/EnumByNameSerializer.kt | 33 ------------------- .../dotmim/sync/data/EnumByValueSerializer.kt | 33 ------------------- .../dotmim/sync/enumerations/SyncDirection.kt | 24 +++++++++++--- .../dotmim/sync/enumerations/SyncStage.kt | 22 +++++++++++-- .../dotmim/sync/enumerations/SyncWay.kt | 20 +++++++++-- .../sync/interceptors/ISyncInterceptor.kt | 4 +-- .../com/mimetis/dotmim/sync/setup/DbType.kt | 22 +++++++++++-- .../dotmim/sync/web/client/HttpStep.kt | 22 +++++++++++-- 9 files changed, 115 insertions(+), 87 deletions(-) delete mode 100644 dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByNameSerializer.kt delete mode 100644 dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByValueSerializer.kt diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/DataRowState.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/DataRowState.kt index b11910b..df41bf1 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/DataRowState.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/DataRowState.kt @@ -1,10 +1,26 @@ package com.mimetis.dotmim.sync -import kotlinx.serialization.Serializable -import com.mimetis.dotmim.sync.data.EnumByValueSerializer import com.mimetis.dotmim.sync.data.EnumWithValue +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +class DataRowStateSerializer : KSerializer { + private var values: Map? = null -class DataRowStateSerializer : EnumByValueSerializer() + override val descriptor = PrimitiveSerialDescriptor("com.mimetis.dotmim.sync.EnumByValue.DataRowState", PrimitiveKind.INT) + + override fun serialize(encoder: Encoder, value: DataRowState) { + encoder.encodeInt(value.value) + } + + override fun deserialize(decoder: Decoder): DataRowState = + (values + ?: DataRowState .entries.associateBy { it.value }.also { values = it })[decoder.decodeInt()]!! +} @Serializable(with = DataRowStateSerializer::class) enum class DataRowState(override val value: Int) : EnumWithValue { diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByNameSerializer.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByNameSerializer.kt deleted file mode 100644 index 945a53b..0000000 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByNameSerializer.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.mimetis.dotmim.sync.data - -import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import java.lang.reflect.ParameterizedType - -open class EnumByNameSerializer : KSerializer - where T : Enum { - private var values: Map? = null - - @Suppress("UNCHECKED_CAST") - private fun getEnumClass(): Class = - ((this.javaClass - .genericSuperclass as ParameterizedType) - .actualTypeArguments[0] as Class) - - override val descriptor = PrimitiveSerialDescriptor("EnumByName_${getEnumClass().name}", PrimitiveKind.STRING) - - override fun deserialize(decoder: Decoder): T = - (values - ?: getEnumClass().enumConstants.associateBy { it.name }.also { values = it })[decoder.decodeString()]!! - -// private inline fun getValue(name: String): T = -// (values -// ?: R::class.java.enumConstants.associateBy { it.name }.also { values = it })[name]!! - - override fun serialize(encoder: Encoder, value: T) { - encoder.encodeString(value.name) - } -} diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByValueSerializer.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByValueSerializer.kt deleted file mode 100644 index eb14013..0000000 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/data/EnumByValueSerializer.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.mimetis.dotmim.sync.data - -import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import java.lang.reflect.ParameterizedType - -open class EnumByValueSerializer : KSerializer - where T : Enum, T : EnumWithValue { - private var values: Map? = null - - @Suppress("UNCHECKED_CAST") - private fun getEnumClass(): Class = - ((this.javaClass - .genericSuperclass as ParameterizedType) - .actualTypeArguments[0] as Class) - - override val descriptor = PrimitiveSerialDescriptor("EnumByValue_${getEnumClass().name}", PrimitiveKind.INT) - - override fun deserialize(decoder: Decoder): T = - (values - ?: getEnumClass().enumConstants.associateBy { it.value }.also { values = it })[decoder.decodeInt()]!! - -// private inline fun getValue(name: String): T = -// (values -// ?: R::class.java.enumConstants.associateBy { it.name }.also { values = it })[name]!! - - override fun serialize(encoder: Encoder, value: T) { - encoder.encodeInt(value.value) - } -} diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncDirection.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncDirection.kt index cd80bb8..673c338 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncDirection.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncDirection.kt @@ -1,13 +1,17 @@ package com.mimetis.dotmim.sync.enumerations -import kotlinx.serialization.Serializable -import com.mimetis.dotmim.sync.data.EnumByValueSerializer import com.mimetis.dotmim.sync.data.EnumWithValue +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder /** * Sync direction : Can be Bidirectional (default), DownloadOnly, UploadOnly */ -@Serializable(with = SyncDirectionSeralizer::class) +@Serializable(with = SyncDirectionSerializer::class) enum class SyncDirection(override val value: Int) : EnumWithValue { /** * Table will be sync from server to client and from client to server @@ -33,4 +37,16 @@ enum class SyncDirection(override val value: Int) : EnumWithValue { None(8) } -class SyncDirectionSeralizer : EnumByValueSerializer() +class SyncDirectionSerializer : KSerializer { + private var values: Map? = null + + override val descriptor = PrimitiveSerialDescriptor("com.mimetis.dotmim.sync.EnumByValue.SyncDirection", PrimitiveKind.INT) + + override fun serialize(encoder: Encoder, value: SyncDirection) { + encoder.encodeInt(value.value) + } + + override fun deserialize(decoder: Decoder): SyncDirection = + (values + ?: SyncDirection.entries.associateBy { it.value }.also { values = it })[decoder.decodeInt()]!! +} diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncStage.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncStage.kt index 9c12440..a24147a 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncStage.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncStage.kt @@ -1,8 +1,12 @@ package com.mimetis.dotmim.sync.enumerations -import kotlinx.serialization.Serializable -import com.mimetis.dotmim.sync.data.EnumByValueSerializer import com.mimetis.dotmim.sync.data.EnumWithValue +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder @Serializable(with = SyncStageSerializer::class) enum class SyncStage(override val value: Int) : EnumWithValue { @@ -30,4 +34,16 @@ enum class SyncStage(override val value: Int) : EnumWithValue { MetadataCleaning(13), } -class SyncStageSerializer : EnumByValueSerializer() +class SyncStageSerializer : KSerializer { + private var values: Map? = null + + override val descriptor = PrimitiveSerialDescriptor("com.mimetis.dotmim.sync.EnumByValue.SyncStage", PrimitiveKind.INT) + + override fun serialize(encoder: Encoder, value: SyncStage) { + encoder.encodeInt(value.value) + } + + override fun deserialize(decoder: Decoder): SyncStage = + (values + ?: SyncStage.entries.associateBy { it.value }.also { values = it })[decoder.decodeInt()]!! +} diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncWay.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncWay.kt index 7d4ad29..3b25a09 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncWay.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/enumerations/SyncWay.kt @@ -1,10 +1,26 @@ package com.mimetis.dotmim.sync.enumerations import kotlinx.serialization.Serializable -import com.mimetis.dotmim.sync.data.EnumByValueSerializer import com.mimetis.dotmim.sync.data.EnumWithValue +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder -class SyncWaySerializer : EnumByValueSerializer() +class SyncWaySerializer : KSerializer { + private var values: Map? = null + + override val descriptor = PrimitiveSerialDescriptor("com.mimetis.dotmim.sync.EnumByValue.SyncWay", PrimitiveKind.INT) + + override fun serialize(encoder: Encoder, value: SyncWay) { + encoder.encodeInt(value.value) + } + + override fun deserialize(decoder: Decoder): SyncWay = + (values + ?: SyncWay.entries.associateBy { it.value }.also { values = it })[decoder.decodeInt()]!! +} @Serializable(with = SyncWaySerializer::class) enum class SyncWay(override val value: Int) : EnumWithValue { diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/ISyncInterceptor.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/ISyncInterceptor.kt index 7449d99..36e4688 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/ISyncInterceptor.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/ISyncInterceptor.kt @@ -1,8 +1,6 @@ package com.mimetis.dotmim.sync.interceptors -import java.io.Closeable - -interface ISyncInterceptor : Closeable { +interface ISyncInterceptor : AutoCloseable { } interface ISyncInterceptor1 : ISyncInterceptor { diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/DbType.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/DbType.kt index 7009a26..3b1f121 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/DbType.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/setup/DbType.kt @@ -1,10 +1,26 @@ package com.mimetis.dotmim.sync.setup -import kotlinx.serialization.Serializable -import com.mimetis.dotmim.sync.data.EnumByValueSerializer import com.mimetis.dotmim.sync.data.EnumWithValue +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +class DbTypeSerializer : KSerializer { + private var values: Map? = null -class DbTypeSerializer : EnumByValueSerializer() + override val descriptor = PrimitiveSerialDescriptor("com.mimetis.dotmim.sync.EnumByValue.DbType", PrimitiveKind.INT) + + override fun serialize(encoder: Encoder, value: DbType) { + encoder.encodeInt(value.value) + } + + override fun deserialize(decoder: Decoder): DbType = + (values + ?: DbType.entries.associateBy { it.value }.also { values = it })[decoder.decodeInt()]!! +} @Serializable(with = DbTypeSerializer::class) enum class DbType(override val value: Int): EnumWithValue { diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpStep.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpStep.kt index 482c1e0..a8efd61 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpStep.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpStep.kt @@ -1,10 +1,26 @@ package com.mimetis.dotmim.sync.web.client -import kotlinx.serialization.Serializable -import com.mimetis.dotmim.sync.data.EnumByValueSerializer import com.mimetis.dotmim.sync.data.EnumWithValue +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +class HttpStepSerializer : KSerializer { + private var values: Map? = null -class HttpStepSerializer : EnumByValueSerializer() + override val descriptor = PrimitiveSerialDescriptor("com.mimetis.dotmim.sync.EnumByValue.HttpStep", PrimitiveKind.INT) + + override fun serialize(encoder: Encoder, value: HttpStep) { + encoder.encodeInt(value.value) + } + + override fun deserialize(decoder: Decoder): HttpStep = + (values + ?: HttpStep.entries.associateBy { it.value }.also { values = it })[decoder.decodeInt()]!! +} @Serializable(with = HttpStepSerializer::class) enum class HttpStep(override val value: Int) : EnumWithValue { From ac5eecf21f4d36251e03b323e71323c09abbfd23 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 09:09:12 +0200 Subject: [PATCH 42/81] Updated sync set classes --- .../com/mimetis/dotmim/sync/Extensions.kt | 53 +------------------ .../mimetis/dotmim/sync/set/CompareHelper.kt | 28 +++++++++- .../mimetis/dotmim/sync/set/ContainerTable.kt | 25 ++++----- .../dotmim/sync/set/SyncFilterJoins.kt | 2 +- .../dotmim/sync/set/SyncFilterParameters.kt | 2 +- .../sync/set/SyncFilterWhereSideItems.kt | 2 +- .../mimetis/dotmim/sync/set/SyncNamedItem.kt | 3 -- .../mimetis/dotmim/sync/set/SyncRelations.kt | 51 ++++++++++++++++-- 8 files changed, 93 insertions(+), 73 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt index 8a02a75..f634e2c 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt @@ -1,54 +1,5 @@ package com.mimetis.dotmim.sync -import com.mimetis.dotmim.sync.set.SyncColumn -import com.mimetis.dotmim.sync.set.SyncColumns -import com.mimetis.dotmim.sync.set.SyncNamedItem -import java.text.SimpleDateFormat -import java.util.* +import kotlinx.datetime.Clock -fun SyncColumns?.compareWith(other: SyncColumns?): Boolean { - // checking null ref - if ((this == null && other != null) || (this != null && other == null)) - return false - - // If both are null, return true - if (this == null && other == null) - return true - - if (this!!.size != other!!.size) - return false - - // Check all items are identical - return this.all { sourceItem -> - other.any { otherItem -> - val cSourceItem = sourceItem as? SyncNamedItem - val cOtherItem = otherItem as? SyncNamedItem - - if (cSourceItem != null && cOtherItem != null) - return cSourceItem.equalsByProperties(otherItem) - else - return sourceItem.equals(otherItem) - - } - } -} - -fun utcNow(): Long { - val time = Calendar.getInstance(Locale.getDefault()).timeInMillis - try { - val dateFormat = SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.getDefault()) - val date = Date(time) - dateFormat.timeZone = TimeZone.getTimeZone("UTC") - val strDate = dateFormat.format(date) -// System.out.println("Local Millis * " + date.getTime() + " ---UTC time " + strDate);//correct - - val dateFormatLocal = SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.getDefault()) - val utcDate = dateFormatLocal.parse(strDate) -// System.out.println("UTC Millis * " + utcDate.getTime() + " ------ " + dateFormatLocal.format(utcDate)); - val utcMillis = utcDate?.time ?: Date().time - return utcMillis - } catch (e: Exception) { - e.printStackTrace() - } - return time -} +fun utcNow(): Long = Clock.System.now().toEpochMilliseconds() diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/CompareHelper.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/CompareHelper.kt index 8b80b3f..944be66 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/CompareHelper.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/CompareHelper.kt @@ -10,7 +10,33 @@ fun List?.compareWith(other: List?): Boolean { return true if (this!!.size != other!!.size) - return false; + return false + + // Check all items are identical + return this.all { sourceItem -> + other.any { otherItem -> + val cSourceItem = sourceItem as? SyncNamedItem + val cOtherItem = sourceItem as? SyncNamedItem + + if (cSourceItem != null && cOtherItem != null) + return cSourceItem.equalsByProperties(otherItem) + else + sourceItem == otherItem + } + } +} + +fun CustomList?.compareWith(other: CustomList?): Boolean { + // checking null ref + if ((this == null && other != null) || (this != null && other == null)) + return false + + // If both are null, return true + if (this == null && other == null) + return true + + if (this!!.size != other!!.size) + return false // Check all items are identical return this.all { sourceItem -> diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt index 5c1d3d5..95d33c4 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt @@ -1,11 +1,12 @@ package com.mimetis.dotmim.sync.set +import com.ionspin.kotlin.bignum.decimal.BigDecimal import com.mimetis.dotmim.sync.PrimitiveSerializer import com.mimetis.dotmim.sync.serialization.DmUtils +import kotlinx.datetime.LocalDateTime import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import java.math.BigDecimal -import java.util.Date +import kotlin.reflect.KClass import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -38,18 +39,18 @@ class ContainerTable( var byteCount: Long = 0 for (obj in itemArray) { - val objType = if (obj != null) obj::class.java else null + val objType = if (obj != null) obj::class else null if (obj == null) byteCount += 5 // else if (obj is DBNull) // byteCount += 5 - else if (objType == String::class.java) + else if (objType == String::class) byteCount += (obj as String).length - else if (objType == ByteArray::class.java) + else if (objType == ByteArray::class) byteCount += (obj as ByteArray).size else - byteCount += getSizeForType(obj::class.java) + byteCount += getSizeForType(obj::class) // Size for the type if (objType != null) @@ -68,17 +69,17 @@ class ContainerTable( /** * Gets a size for a given type */ - fun getSizeForType(type: Class<*>): Long = + fun getSizeForType(type: KClass<*>): Long = when (type) { - Long::class.java, ULong::class.java, Double::class.java, Date::class.java -> + Long::class, ULong::class, Double::class, LocalDateTime::class -> 8 - Boolean::class.java, Byte::class.java -> + Boolean::class, Byte::class -> 1 - Char::class.java, Short::class.java, UShort::class.java -> + Char::class, Short::class, UShort::class -> 2 - Int::class.java, UInt::class.java, Float::class.java -> + Int::class, UInt::class, Float::class -> 4 - BigDecimal::class.java, Uuid::class.java -> + BigDecimal::class, Uuid::class -> 16 else -> 0 diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoins.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoins.kt index 9a6cf89..534eaf3 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoins.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterJoins.kt @@ -34,7 +34,7 @@ class SyncFilterJoins() : CustomList() { @OptIn(ExperimentalSerializationApi::class) object SyncFilterJoinsSerializer : ArrayListLikeSerializer(SyncFilterJoin.serializer()) { - override val descriptor: SerialDescriptor = listSerialDescriptor() + override val descriptor: SerialDescriptor = listSerialDescriptor() override fun deserialize(decoder: Decoder): SyncFilterJoins { val items = ArrayList() diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameters.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameters.kt index 7691044..fe396c5 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameters.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterParameters.kt @@ -34,7 +34,7 @@ class SyncFilterParameters() : CustomList() { @OptIn(ExperimentalSerializationApi::class) object SyncFilterParametersSerializer : ArrayListLikeSerializer(SyncFilterParameter.serializer()) { - override val descriptor: SerialDescriptor = listSerialDescriptor() + override val descriptor: SerialDescriptor = listSerialDescriptor() override fun deserialize(decoder: Decoder): SyncFilterParameters { val items = ArrayList() diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItems.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItems.kt index b426c99..6ea189c 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItems.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncFilterWhereSideItems.kt @@ -36,7 +36,7 @@ object SyncFilterWhereSideItemsSerializer : ArrayListLikeSerializer( SyncFilterWhereSideItem.serializer() ) { - override val descriptor: SerialDescriptor = listSerialDescriptor() + override val descriptor: SerialDescriptor = listSerialDescriptor() override fun deserialize(decoder: Decoder): SyncFilterWhereSideItems { val items = ArrayList() diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncNamedItem.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncNamedItem.kt index e949ab8..4213de4 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncNamedItem.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncNamedItem.kt @@ -50,7 +50,4 @@ abstract class SyncNamedItem { override fun equals(other: Any?): Boolean = this.equalsByProperties(other as? T) - - override fun hashCode(): Int = - javaClass.hashCode() } diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRelations.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRelations.kt index ee076ac..afea6ea 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRelations.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRelations.kt @@ -1,11 +1,20 @@ package com.mimetis.dotmim.sync.set +import com.mimetis.dotmim.sync.ArrayListLikeSerializer +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable import kotlinx.serialization.Transient -import com.mimetis.dotmim.sync.ArrayListLikeSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.listSerialDescriptor +import kotlinx.serialization.encoding.CompositeDecoder +import kotlinx.serialization.encoding.Decoder @Serializable(with = SyncRelationsSerializer::class) -class SyncRelations() : ArrayList() { +class SyncRelations() : CustomList() { + internal constructor(items: List) : this() { + internalList.addAll(items) + } + /** * Relation's schema */ @@ -30,4 +39,40 @@ class SyncRelations() : ArrayList() { } } -object SyncRelationsSerializer : ArrayListLikeSerializer(SyncRelation.serializer()) +@OptIn(ExperimentalSerializationApi::class) +object SyncRelationsSerializer : ArrayListLikeSerializer(SyncRelation.serializer()) { + override val descriptor: SerialDescriptor = listSerialDescriptor() + + override fun deserialize(decoder: Decoder): SyncRelations { + val items = ArrayList() + + val compositeDecoder = decoder.beginStructure(descriptor) + + if (compositeDecoder.decodeSequentially()) { + val size = compositeDecoder.decodeCollectionSize(descriptor) + for (i in 0 until size) { + val element = compositeDecoder.decodeSerializableElement( + elementSerializer.descriptor, + i, + elementSerializer + ) + items.add(element) + } + } else { + while (true) { + val index = + compositeDecoder.decodeElementIndex(elementSerializer.descriptor) + if (index == CompositeDecoder.DECODE_DONE) break + val element = compositeDecoder.decodeSerializableElement( + elementSerializer.descriptor, + index, + elementSerializer + ) + items.add(element) + } + } + compositeDecoder.endStructure(descriptor) + + return SyncRelations(items) + } +} From 98955b70563e9fa0174155a2a27282442d36f50d Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 09:09:49 +0200 Subject: [PATCH 43/81] Sqlite wrappers with sqlite native --- .../dotmim/sync/sqlite/CursorHelper.kt | 35 ++++--- .../dotmim/sync/sqlite/SqliteDbMetadata.kt | 24 ++--- .../dotmim/sync/sqlite/SqliteSyncAdapter.kt | 96 ++++++++++--------- .../dotmim/sync/sqlite/SqliteSyncProvider.kt | 11 ++- 4 files changed, 89 insertions(+), 77 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt index a6dbb28..62a7f2b 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/CursorHelper.kt @@ -1,28 +1,33 @@ package com.mimetis.dotmim.sync.sqlite -import android.database.Cursor -import android.database.Cursor.* +import androidx.sqlite.SQLITE_DATA_BLOB +import androidx.sqlite.SQLITE_DATA_FLOAT +import androidx.sqlite.SQLITE_DATA_INTEGER +import androidx.sqlite.SQLITE_DATA_NULL +import androidx.sqlite.SQLITE_DATA_TEXT +import androidx.sqlite.SQLiteStatement +import kotlin.reflect.KClass object CursorHelper { - fun Cursor.getValue(columnIndex: Int): Any? = + fun SQLiteStatement.getValue(columnIndex: Int): Any? = if (this.isNull(columnIndex)) null else - when (this.getType(columnIndex)) { - FIELD_TYPE_NULL -> null - FIELD_TYPE_INTEGER -> this.getInt(columnIndex) - FIELD_TYPE_FLOAT -> this.getDouble(columnIndex) - FIELD_TYPE_STRING -> this.getString(columnIndex) - FIELD_TYPE_BLOB -> this.getBlob(columnIndex) + when (this.getColumnType(columnIndex)) { + SQLITE_DATA_NULL -> null + SQLITE_DATA_INTEGER -> this.getInt(columnIndex) + SQLITE_DATA_FLOAT -> this.getDouble(columnIndex) + SQLITE_DATA_TEXT -> this.getText(columnIndex) + SQLITE_DATA_BLOB -> this.getBlob(columnIndex) else -> null } - fun Int.getDataType(): Class<*> = + fun Int.getDataType(): KClass<*> = when (this) { - FIELD_TYPE_INTEGER -> Long::class.java - FIELD_TYPE_STRING -> String::class.java - FIELD_TYPE_FLOAT -> Double::class.java - FIELD_TYPE_BLOB -> ByteArray::class.java - else -> Any::class.java + SQLITE_DATA_INTEGER -> Long::class + SQLITE_DATA_TEXT -> String::class + SQLITE_DATA_FLOAT -> Double::class + SQLITE_DATA_BLOB -> ByteArray::class + else -> Any::class } } diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteDbMetadata.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteDbMetadata.kt index 8c8c112..2cc132f 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteDbMetadata.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteDbMetadata.kt @@ -3,11 +3,11 @@ package com.mimetis.dotmim.sync.sqlite import com.mimetis.dotmim.sync.builders.DbMetadata import com.mimetis.dotmim.sync.set.SyncColumn import com.mimetis.dotmim.sync.setup.DbType -import java.util.* +import kotlin.reflect.KClass class SqliteDbMetadata : DbMetadata() { override fun isValid(columnDefinition: SyncColumn): Boolean { - var typeName = columnDefinition.originalTypeName.lowercase(Locale.getDefault()) + var typeName = columnDefinition.originalTypeName.lowercase() if (typeName.contains("(")) typeName = typeName.substring(0, typeName.indexOf("(")) @@ -43,7 +43,7 @@ class SqliteDbMetadata : DbMetadata() { if (tn.contains("(")) tn = tn.substring(0, typeName.indexOf("(")) - when (tn.lowercase(Locale.getDefault())) { + when (tn.lowercase()) { "bit", "integer", "bigint" -> @@ -66,16 +66,16 @@ class SqliteDbMetadata : DbMetadata() { throw Exception("this type name $tn is not supported") } - override fun validateType(ownerType: Any): Class<*> { + override fun validateType(ownerType: Any): KClass<*> { return when (ownerType as SqliteType) { SqliteType.Integer -> - Long::class.java + Long::class SqliteType.Real -> - Double::class.java + Double::class SqliteType.Text -> - String::class.java + String::class SqliteType.Blob -> - Any::class.java + Any::class else -> throw Exception("this DbType $ownerType is not supported") } @@ -86,7 +86,7 @@ class SqliteDbMetadata : DbMetadata() { if (tn.contains("(")) tn = tn.substring(0, typeName.indexOf("(")) - when (tn.lowercase(Locale.getDefault())) { + when (tn.lowercase()) { "bit" -> return DbType.Boolean "integer", @@ -116,7 +116,7 @@ class SqliteDbMetadata : DbMetadata() { false override fun isNumericType(typeName: String): Boolean { - var tn = typeName.lowercase(Locale.getDefault()) + var tn = typeName.lowercase() if (tn.contains("(")) tn = typeName.substring(0, tn.indexOf("(")) @@ -126,12 +126,12 @@ class SqliteDbMetadata : DbMetadata() { } override fun isTextType(typeName: String): Boolean { - val tn = typeName.lowercase(Locale.getDefault()) + val tn = typeName.lowercase() return tn == "text" } override fun supportScale(typeName: String): Boolean { - val tn = typeName.lowercase(Locale.getDefault()) + val tn = typeName.lowercase() return tn == "numeric" || tn == "decimal" || tn == "real" || tn == "flot" } diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt index 7cc0f4d..a2d744b 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncAdapter.kt @@ -1,9 +1,8 @@ package com.mimetis.dotmim.sync.sqlite -import android.database.Cursor -import android.database.sqlite.SQLiteDatabase -import android.os.Build +import androidx.sqlite.SQLiteConnection import androidx.sqlite.SQLiteStatement +import androidx.sqlite.execSQL import com.mimetis.dotmim.sync.DbSyncAdapter import com.mimetis.dotmim.sync.builders.ParserName import com.mimetis.dotmim.sync.set.SyncColumn @@ -11,25 +10,28 @@ import com.mimetis.dotmim.sync.set.SyncRow import com.mimetis.dotmim.sync.set.SyncTable import com.mimetis.dotmim.sync.setup.DbType import com.mimetis.dotmim.sync.setup.SyncSetup -import java.text.SimpleDateFormat -import java.util.Locale +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.format.FormatStringsInDatetimeFormats +import kotlinx.datetime.format.byUnicodePattern import kotlin.io.encoding.Base64 import kotlin.io.encoding.ExperimentalEncodingApi import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid -@OptIn(ExperimentalUuidApi::class, ExperimentalEncodingApi::class) +@OptIn(ExperimentalUuidApi::class, ExperimentalEncodingApi::class, + FormatStringsInDatetimeFormats::class +) class SqliteSyncAdapter( tableDescription: SyncTable, private val tableName: ParserName, private val trackingName: ParserName, setup: SyncSetup, - private val database: SQLiteDatabase + private val database: SQLiteConnection ) : DbSyncAdapter(tableDescription, setup) { - private val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) + private val dateFormat = LocalDateTime.Format { byUnicodePattern("yyyy-MM-dd HH:mm:ss") } private var getSelectChangesSql = "" - override fun getSelectInitializedChanges(): Cursor { + override fun getSelectInitializedChanges(): SQLiteStatement { val stringBuilder = StringBuilder("SELECT ") for (pkColumn in this.tableDescription.getPrimaryKeysColumns()) { val columnName = ParserName.parse(pkColumn).quoted().toString() @@ -47,10 +49,10 @@ class SqliteSyncAdapter( } stringBuilder.appendLine("FROM ${tableName.quoted()} [base]") - return database.rawQuery(stringBuilder.toString(), null) + return database.prepare(stringBuilder.toString()) } - override fun getSelectChanges(lastTimestamp: Long?): Cursor { + override fun getSelectChanges(lastTimestamp: Long?): SQLiteStatement { if (getSelectChangesSql.isEmpty()) { val stringBuilder = StringBuilder("SELECT ") for (pkColumn in this.tableDescription.getPrimaryKeysColumns()) { @@ -83,12 +85,14 @@ class SqliteSyncAdapter( // Looking at discussion https://github.com/Mimetis/Dotmim.Sync/discussions/453, trying to remove ([side].[update_scope_id] <> @sync_scope_id) // since we are sure that sqlite will never be a server side database - stringBuilder.appendLine("WHERE ([side].[timestamp] > @sync_min_timestamp AND [side].[update_scope_id] IS NULL)") + stringBuilder.appendLine("WHERE ([side].[timestamp] > ? AND [side].[update_scope_id] IS NULL)") getSelectChangesSql = stringBuilder.toString() } - return database.rawQuery(getSelectChangesSql, arrayOf((lastTimestamp ?: 0).toString())) + return database.prepare(getSelectChangesSql).apply { + bindLong(1, lastTimestamp ?: 0) + } } private val getSelectRowQuery: SqliteQueryWrapper = SqliteQueryWrapper( @@ -130,7 +134,7 @@ class SqliteSyncAdapter( return@SqliteQueryWrapper stringBuilder.toString() } - override fun getSelectRow(primaryKeyRow: SyncRow): Cursor { + override fun getSelectRow(primaryKeyRow: SyncRow): SQLiteStatement { val parameters = mutableMapOf() fillParametersFromColumns( parameters, @@ -399,35 +403,35 @@ class SqliteSyncAdapter( empty = "\n, " } - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { - // No support for "ON CONFLICT" in Android < 11 because this is supported in Sqlite after 3.24 - stringBuilder.appendLine("INSERT OR REPLACE INTO ${tableName.quoted()}") - stringBuilder.appendLine("(${stringBuilderArguments})") - stringBuilder.appendLine("SELECT $stringBuilderParameters ") - stringBuilder.appendLine("FROM (SELECT ${stringBuilderParametersValues}) as [c]") - stringBuilder.appendLine("LEFT JOIN ${trackingName.quoted()} AS [side] ON $str1") - stringBuilder.appendLine("LEFT JOIN ${tableName.quoted()} AS [base] ON $str2") - - stringBuilder.appendLine( - "WHERE (${ - SqliteManagementUtils.whereColumnAndParameters( - this.tableDescription.primaryKeys, - "[base]" - ) - } " - ) - stringBuilder.appendLine("AND ([side].[timestamp] < @sync_min_timestamp OR [side].[update_scope_id] = @sync_scope_id)) ") - stringBuilder.appendLine( - "OR (${ - SqliteManagementUtils.whereColumnIsNull( - this.tableDescription.primaryKeys, - "[base]" - ) - } " - ) - stringBuilder.appendLine("AND ([side].[timestamp] < @sync_min_timestamp OR [side].[timestamp] IS NULL)) ") - stringBuilder.appendLine("OR @sync_force_write = 1;") - } else { +// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { +// // No support for "ON CONFLICT" in Android < 11 because this is supported in Sqlite after 3.24 +// stringBuilder.appendLine("INSERT OR REPLACE INTO ${tableName.quoted()}") +// stringBuilder.appendLine("(${stringBuilderArguments})") +// stringBuilder.appendLine("SELECT $stringBuilderParameters ") +// stringBuilder.appendLine("FROM (SELECT ${stringBuilderParametersValues}) as [c]") +// stringBuilder.appendLine("LEFT JOIN ${trackingName.quoted()} AS [side] ON $str1") +// stringBuilder.appendLine("LEFT JOIN ${tableName.quoted()} AS [base] ON $str2") +// +// stringBuilder.appendLine( +// "WHERE (${ +// SqliteManagementUtils.whereColumnAndParameters( +// this.tableDescription.primaryKeys, +// "[base]" +// ) +// } " +// ) +// stringBuilder.appendLine("AND ([side].[timestamp] < @sync_min_timestamp OR [side].[update_scope_id] = @sync_scope_id)) ") +// stringBuilder.appendLine( +// "OR (${ +// SqliteManagementUtils.whereColumnIsNull( +// this.tableDescription.primaryKeys, +// "[base]" +// ) +// } " +// ) +// stringBuilder.appendLine("AND ([side].[timestamp] < @sync_min_timestamp OR [side].[timestamp] IS NULL)) ") +// stringBuilder.appendLine("OR @sync_force_write = 1;") +// } else { // create update statement without PK var emptyUpdate = "" var columnsToUpdate = false @@ -478,7 +482,7 @@ class SqliteSyncAdapter( stringBuilder.append(stringBuilderUpdateSet).appendLine(";") } else stringBuilder.appendLine(" ON CONFLICT (${primaryKeys}) DO NOTHING; ") - } +// } return@SqliteQueryWrapper stringBuilder.toString() } @@ -593,8 +597,8 @@ class SqliteSyncAdapter( override fun deleteMetadata(timestamp: Long): Int { database.execSQL("DELETE FROM ${trackingName.quoted()} WHERE [timestamp] < $timestamp;") - return database.rawQuery("SELECT changes()", null).use { cursor -> - if (cursor.moveToNext()) + return database.prepare("SELECT changes()").use { cursor -> + if (cursor.step()) cursor.getInt(0) else 0 diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncProvider.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncProvider.kt index 554b6bb..bb4709f 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncProvider.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteSyncProvider.kt @@ -1,16 +1,19 @@ package com.mimetis.dotmim.sync.sqlite -import android.database.sqlite.SQLiteOpenHelper +import androidx.sqlite.SQLiteConnection import com.mimetis.dotmim.sync.CoreProvider import com.mimetis.dotmim.sync.DbSyncAdapter -import com.mimetis.dotmim.sync.builders.* +import com.mimetis.dotmim.sync.builders.DbBuilder +import com.mimetis.dotmim.sync.builders.DbMetadata +import com.mimetis.dotmim.sync.builders.DbScopeBuilder +import com.mimetis.dotmim.sync.builders.DbTableBuilder +import com.mimetis.dotmim.sync.builders.ParserName import com.mimetis.dotmim.sync.set.SyncTable import com.mimetis.dotmim.sync.setup.SyncSetup class SqliteSyncProvider( - helper: SQLiteOpenHelper + private val database: SQLiteConnection ) : CoreProvider() { - private val database = helper.writableDatabase private lateinit var metadata: DbMetadata override val supportBulkOperations: Boolean get() = false From fbb0f6d89815098b2b9f6fce65c7dfa1c3e6cbec Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 09:10:30 +0200 Subject: [PATCH 44/81] LocalOrchestrator and SyncAgent updated with KMP --- .../com/mimetis/dotmim/sync/SyncAgent.kt | 99 +++++++++++++------ .../sync/orchestrators/LocalOrchestrator.kt | 25 +++-- 2 files changed, 88 insertions(+), 36 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt index 0a8356f..6184936 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncAgent.kt @@ -1,6 +1,5 @@ package com.mimetis.dotmim.sync -import android.util.Log import com.mimetis.dotmim.sync.args.ProgressArgs import com.mimetis.dotmim.sync.enumerations.ConflictResolutionPolicy import com.mimetis.dotmim.sync.enumerations.SyncProvision @@ -11,38 +10,41 @@ import com.mimetis.dotmim.sync.parameter.SyncParameters import com.mimetis.dotmim.sync.scopes.ServerScopeInfo import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.setup.SyncSetup -import java.util.* import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @OptIn(ExperimentalUuidApi::class) class SyncAgent( - clientProvider: CoreProvider, - val remoteOrchestrator: RemoteOrchestrator, - val options: SyncOptions, - val setup: SyncSetup, - private val scopeName: String = SyncOptions.DefaultScopeName + clientProvider: CoreProvider, + val remoteOrchestrator: RemoteOrchestrator, + val options: SyncOptions, + val setup: SyncSetup, + private val scopeName: String = SyncOptions.DefaultScopeName ) { - val localOrchestrator: LocalOrchestrator = LocalOrchestrator(clientProvider, options, setup, scopeName) + val localOrchestrator: LocalOrchestrator = + LocalOrchestrator(clientProvider, options, setup, scopeName) private lateinit var schema: SyncSet val parameters: SyncParameters = SyncParameters() - suspend fun synchronize(syncType: SyncType = SyncType.Normal, progress: Progress? = null): SyncResult { + suspend fun synchronize( + syncType: SyncType = SyncType.Normal, + progress: Progress? = null + ): SyncResult { val startTime = utcNow() var completeTime = utcNow() val context = SyncContext( - sessionId = Uuid.random(), - scopeName = this.scopeName, - parameters = this.parameters, - syncType = syncType + sessionId = Uuid.random(), + scopeName = this.scopeName, + parameters = this.parameters, + syncType = syncType ) // Result, with sync results stats. val result = SyncResult( - context.sessionId, - startTime, - completeTime, + context.sessionId, + startTime, + completeTime, ) try { @@ -75,8 +77,19 @@ class SyncAgent( this.localOrchestrator.setup = serverScopeInfo.setup // Provision local database - val provision = EnumSet.of(SyncProvision.Table, SyncProvision.TrackingTable, SyncProvision.StoredProcedures, SyncProvision.Triggers) - this.localOrchestrator.provision(serverScopeInfo.schema!!, provision, false, clientScopeInfo, progress) + val provision = HashSet().apply { + add(SyncProvision.Table) + add(SyncProvision.TrackingTable) + add(SyncProvision.StoredProcedures) + add(SyncProvision.Triggers) + } + this.localOrchestrator.provision( + serverScopeInfo.schema!!, + provision, + false, + clientScopeInfo, + progress + ) // Set schema for agent, just to let the opportunity to user to use it. this.schema = serverScopeInfo.schema!! @@ -97,7 +110,8 @@ class SyncAgent( val hasSameOptions = clientScopeInfo.setup!!.hasSameOptions(this.setup) // compare local setup strucutre with remote structure - val hasSameStructure = clientScopeInfo.setup!!.hasSameStructure(serverScopeInfo.setup) + val hasSameStructure = + clientScopeInfo.setup!!.hasSameStructure(serverScopeInfo.setup) if (hasSameStructure) { // Sett schema & setup @@ -121,7 +135,11 @@ class SyncAgent( // If one of the comparison is false, we make a migration if (!hasSameOptions || !hasSameStructure) { - this.localOrchestrator.migration(clientScopeInfo.setup!!, serverScopeInfo.schema!!, progress) + this.localOrchestrator.migration( + clientScopeInfo.setup!!, + serverScopeInfo.schema!!, + progress + ) clientScopeInfo.setup = this.setup clientScopeInfo.schema = serverScopeInfo.schema } @@ -138,7 +156,7 @@ class SyncAgent( // if client does not change SyncType to Reinitialize / ReinitializeWithUpload on SyncInterceptor, we raise an error // otherwise, we are outdated, but we can continue, because we have a new mode. if (isOutDated) - Log.w(TAG, "Client id outdated, but we change mode to ${context.syncType}") + println("[$TAG]: Client id outdated, but we change mode to ${context.syncType}") } context.progressPercentage = 0.1 @@ -151,16 +169,25 @@ class SyncAgent( clientScopeInfo.lastServerSyncTimestamp = null // Get if we need to get all rows from the datasource - val fromScratch = clientScopeInfo.isNewScope || context.syncType == SyncType.Reinitialize || context.syncType == SyncType.ReinitializeWithUpload + val fromScratch = + clientScopeInfo.isNewScope || context.syncType == SyncType.Reinitialize || context.syncType == SyncType.ReinitializeWithUpload // IF is new and we have a snapshot directory, try to apply a snapshot if (fromScratch) { // Get snapshot files - val serverSnapshotChanges = this.remoteOrchestrator.getSnapshot(this.schema, progress) + val serverSnapshotChanges = + this.remoteOrchestrator.getSnapshot(this.schema, progress) // Apply snapshot if (serverSnapshotChanges.second != null) { - val (snapshotChangesAppliedOnClient, clientSI) = this.localOrchestrator.applySnapshot(clientScopeInfo, serverSnapshotChanges.second, clientChanges.first, serverSnapshotChanges.first, serverSnapshotChanges.third, progress) + val (snapshotChangesAppliedOnClient, clientSI) = this.localOrchestrator.applySnapshot( + clientScopeInfo, + serverSnapshotChanges.second, + clientChanges.first, + serverSnapshotChanges.first, + serverSnapshotChanges.third, + progress + ) result.snapshotChangesAppliedOnClient = snapshotChangesAppliedOnClient clientScopeInfo = clientSI } @@ -168,10 +195,15 @@ class SyncAgent( context.progressPercentage = 0.3 // apply is 25%, get changes is 20% - val serverChanges = this.remoteOrchestrator.applyThenGetChanges(clientScopeInfo, clientChanges.second, progress) + val serverChanges = this.remoteOrchestrator.applyThenGetChanges( + clientScopeInfo, + clientChanges.second, + progress + ) // Policy is always Server policy, so reverse this policy to get the client policy - val reverseConflictResolutionPolicy = if (serverChanges.value3 == ConflictResolutionPolicy.ServerWins) ConflictResolutionPolicy.ClientWins else ConflictResolutionPolicy.ServerWins + val reverseConflictResolutionPolicy = + if (serverChanges.value3 == ConflictResolutionPolicy.ServerWins) ConflictResolutionPolicy.ClientWins else ConflictResolutionPolicy.ServerWins // Get if we have already applied a snapshot, so far we don't need to reset table even if we are i Reinitialize Mode val snapshotApplied = result.snapshotChangesAppliedOnClient != null @@ -179,9 +211,16 @@ class SyncAgent( // apply is 25% context.progressPercentage = 0.75 val clientChangesApplied = this.localOrchestrator.applyChanges( - clientScopeInfo, this.schema, serverChanges.value2, - clientChanges.first, serverChanges.value1, reverseConflictResolutionPolicy, snapshotApplied, - serverChanges.value5!!, progress) + clientScopeInfo, + this.schema, + serverChanges.value2, + clientChanges.first, + serverChanges.value1, + reverseConflictResolutionPolicy, + snapshotApplied, + serverChanges.value5!!, + progress + ) completeTime = utcNow() this.localOrchestrator.completeTime = completeTime @@ -216,6 +255,6 @@ class SyncAgent( } companion object { - private val TAG = SyncAgent::class.java.simpleName + private val TAG = SyncAgent::class.simpleName } } diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt index 1046641..057fb83 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt @@ -1,6 +1,15 @@ package com.mimetis.dotmim.sync.orchestrators -import com.mimetis.dotmim.sync.* +import com.mimetis.dotmim.sync.CoreProvider +import com.mimetis.dotmim.sync.DbSyncAdapter +import com.mimetis.dotmim.sync.MissingClientScopeInfoException +import com.mimetis.dotmim.sync.MissingLocalOrchestratorSchemaException +import com.mimetis.dotmim.sync.MissingTablesException +import com.mimetis.dotmim.sync.MissingTrackingTableException +import com.mimetis.dotmim.sync.Progress +import com.mimetis.dotmim.sync.SyncContext +import com.mimetis.dotmim.sync.SyncOptions +import com.mimetis.dotmim.sync.SyncVersion import com.mimetis.dotmim.sync.SyncVersion.major import com.mimetis.dotmim.sync.SyncVersion.toVersionInt import com.mimetis.dotmim.sync.args.ProgressArgs @@ -13,12 +22,16 @@ import com.mimetis.dotmim.sync.enumerations.ConflictResolutionPolicy import com.mimetis.dotmim.sync.enumerations.SyncProvision import com.mimetis.dotmim.sync.enumerations.SyncStage import com.mimetis.dotmim.sync.enumerations.SyncWay -import com.mimetis.dotmim.sync.messages.* +import com.mimetis.dotmim.sync.messages.DatabaseChangesApplied +import com.mimetis.dotmim.sync.messages.DatabaseChangesSelected +import com.mimetis.dotmim.sync.messages.DatabaseMetadatasCleaned +import com.mimetis.dotmim.sync.messages.MessageApplyChanges +import com.mimetis.dotmim.sync.messages.MessageGetChangesBatch import com.mimetis.dotmim.sync.scopes.ScopeInfo import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.set.SyncTable import com.mimetis.dotmim.sync.setup.SyncSetup -import java.util.* +import com.mimetis.dotmim.sync.utcNow import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -395,7 +408,7 @@ class LocalOrchestrator( */ fun provision( schema: SyncSet, - provision: EnumSet, + provision: Set, overwrite: Boolean = false, clientScopeInfo: ScopeInfo? = null, progress: Progress? @@ -437,7 +450,7 @@ class LocalOrchestrator( * Deprovision the orchestrator database based on the provision enumeration */ open fun deprovision( - provision: EnumSet, + provision: Set, clientScopeInfo: ScopeInfo? = null, progress: Progress? = null ): Boolean { @@ -463,7 +476,7 @@ class LocalOrchestrator( */ fun deprovision( schema: SyncSet, - provision: EnumSet, + provision: Set, clientScopeInfo: ScopeInfo? = null, progress: Progress? = null ): Boolean { From b7d919a0cc6f3cb7a44e549fd5aec3c629b9a94d Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 09:35:35 +0200 Subject: [PATCH 45/81] BaseOrchestrator in KMP --- .../dotmim/sync/batch/BatchPartInfo.kt | 7 +- .../sync/messages/MessageGetChangesBatch.kt | 1 + .../sync/orchestrators/BaseOrchestrator.kt | 136 +++++++++++++----- .../dotmim/sync/parameter/SyncParameters.kt | 51 ++++++- .../com/mimetis/dotmim/sync/set/CustomList.kt | 5 +- 5 files changed, 159 insertions(+), 41 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt index 8f13a0a..200cea1 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt @@ -9,6 +9,7 @@ import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.ContainerSet import com.mimetis.dotmim.sync.set.SyncSet import java.io.File +import kotlin.reflect.KClass /** * Info about a BatchPart @@ -47,7 +48,7 @@ class BatchPartInfo { * Gets or Sets the serialized type */ @Transient - var serializedType: Class<*>? = null + var serializedType: KClass<*>? = null /** * Loads the batch file and import the rows in a SyncSet instance @@ -101,7 +102,7 @@ class BatchPartInfo { // backward compatibility if (serializedType == null) - serializedType = ContainerSet::class.java + serializedType = ContainerSet::class var set: ContainerSet? = null @@ -121,7 +122,7 @@ class BatchPartInfo { ignoreUnknownKeys = true isLenient = true } - set = if (serializedType == ContainerSet::class.java) { + set = if (serializedType == ContainerSet::class) { json.decodeFromString(file.readText()) } else { val jsonString: ContainerSetBoilerPlate = json.decodeFromString(file.readText()) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt index b363560..19610fd 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/messages/MessageGetChangesBatch.kt @@ -2,6 +2,7 @@ package com.mimetis.dotmim.sync.messages import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.setup.SyncSetup +import kotlinx.io.files.Path import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt index bd6ed7a..3deb7c7 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt @@ -1,23 +1,94 @@ package com.mimetis.dotmim.sync.orchestrators -import android.database.Cursor -import com.mimetis.dotmim.sync.* -import com.mimetis.dotmim.sync.args.* +import androidx.sqlite.SQLiteStatement +import com.mimetis.dotmim.sync.CoreProvider +import com.mimetis.dotmim.sync.DataRowState +import com.mimetis.dotmim.sync.DbSyncAdapter +import com.mimetis.dotmim.sync.MissingColumnException +import com.mimetis.dotmim.sync.MissingPrimaryKeyColumnException +import com.mimetis.dotmim.sync.MissingPrimaryKeyException +import com.mimetis.dotmim.sync.MissingTableException +import com.mimetis.dotmim.sync.MissingTablesException +import com.mimetis.dotmim.sync.MissingsColumnException +import com.mimetis.dotmim.sync.OutOfDateException +import com.mimetis.dotmim.sync.Progress +import com.mimetis.dotmim.sync.RollbackException +import com.mimetis.dotmim.sync.RowOverSizedException +import com.mimetis.dotmim.sync.SyncConflict +import com.mimetis.dotmim.sync.SyncContext +import com.mimetis.dotmim.sync.SyncOptions +import com.mimetis.dotmim.sync.SyncVersion +import com.mimetis.dotmim.sync.Tuple +import com.mimetis.dotmim.sync.UnknownException +import com.mimetis.dotmim.sync.UnsupportedColumnTypeException +import com.mimetis.dotmim.sync.UnsupportedPrimaryKeyColumnNameException +import com.mimetis.dotmim.sync.args.ApplyChangesFailedArgs +import com.mimetis.dotmim.sync.args.DatabaseChangesAppliedArgs +import com.mimetis.dotmim.sync.args.DatabaseChangesSelectedArgs +import com.mimetis.dotmim.sync.args.DatabaseChangesSelectingArgs +import com.mimetis.dotmim.sync.args.DeprovisionedArgs +import com.mimetis.dotmim.sync.args.DeprovisioningArgs +import com.mimetis.dotmim.sync.args.OutdatedAction +import com.mimetis.dotmim.sync.args.OutdatedArgs +import com.mimetis.dotmim.sync.args.ProgressArgs +import com.mimetis.dotmim.sync.args.ProvisionedArgs +import com.mimetis.dotmim.sync.args.ProvisioningArgs +import com.mimetis.dotmim.sync.args.SchemaLoadedArgs +import com.mimetis.dotmim.sync.args.SchemaLoadingArgs +import com.mimetis.dotmim.sync.args.ScopeSavedArgs +import com.mimetis.dotmim.sync.args.ScopeSavingArgs +import com.mimetis.dotmim.sync.args.ScopeTableCreatedArgs +import com.mimetis.dotmim.sync.args.ScopeTableCreatingArgs +import com.mimetis.dotmim.sync.args.TableChangesAppliedArgs +import com.mimetis.dotmim.sync.args.TableChangesApplyingArgs +import com.mimetis.dotmim.sync.args.TableChangesBatchAppliedArgs +import com.mimetis.dotmim.sync.args.TableChangesBatchApplyingArgs +import com.mimetis.dotmim.sync.args.TableChangesSelectedArgs +import com.mimetis.dotmim.sync.args.TableChangesSelectingArgs import com.mimetis.dotmim.sync.batch.BatchInfo -import com.mimetis.dotmim.sync.builders.* -import com.mimetis.dotmim.sync.enumerations.* +import com.mimetis.dotmim.sync.builders.DbScopeBuilder +import com.mimetis.dotmim.sync.builders.DbScopeType +import com.mimetis.dotmim.sync.builders.DbStoredProcedureType +import com.mimetis.dotmim.sync.builders.DbTableBuilder +import com.mimetis.dotmim.sync.builders.DbTriggerType +import com.mimetis.dotmim.sync.enumerations.ApplyAction +import com.mimetis.dotmim.sync.enumerations.ConflictResolution +import com.mimetis.dotmim.sync.enumerations.ConflictResolutionPolicy +import com.mimetis.dotmim.sync.enumerations.ConflictType +import com.mimetis.dotmim.sync.enumerations.SyncDirection +import com.mimetis.dotmim.sync.enumerations.SyncProvision +import com.mimetis.dotmim.sync.enumerations.SyncStage +import com.mimetis.dotmim.sync.enumerations.SyncType +import com.mimetis.dotmim.sync.enumerations.SyncWay import com.mimetis.dotmim.sync.interceptors.Interceptors import com.mimetis.dotmim.sync.manager.DbRelationDefinition -import com.mimetis.dotmim.sync.messages.* +import com.mimetis.dotmim.sync.messages.DatabaseChangesApplied +import com.mimetis.dotmim.sync.messages.DatabaseChangesSelected +import com.mimetis.dotmim.sync.messages.DatabaseMetadatasCleaned +import com.mimetis.dotmim.sync.messages.MessageApplyChanges +import com.mimetis.dotmim.sync.messages.MessageGetChangesBatch +import com.mimetis.dotmim.sync.messages.TableChangesApplied +import com.mimetis.dotmim.sync.messages.TableChangesSelected +import com.mimetis.dotmim.sync.messages.TableMetadatasCleaned import com.mimetis.dotmim.sync.parameter.SyncParameters import com.mimetis.dotmim.sync.scopes.ScopeInfo import com.mimetis.dotmim.sync.scopes.ServerScopeInfo -import com.mimetis.dotmim.sync.set.* +import com.mimetis.dotmim.sync.set.ContainerTable +import com.mimetis.dotmim.sync.set.CustomList +import com.mimetis.dotmim.sync.set.SyncColumn +import com.mimetis.dotmim.sync.set.SyncColumnIdentifier +import com.mimetis.dotmim.sync.set.SyncFilter +import com.mimetis.dotmim.sync.set.SyncRelation +import com.mimetis.dotmim.sync.set.SyncRow +import com.mimetis.dotmim.sync.set.SyncSet +import com.mimetis.dotmim.sync.set.SyncTable +import com.mimetis.dotmim.sync.set.isNullOrEmpty import com.mimetis.dotmim.sync.setup.SetupTable import com.mimetis.dotmim.sync.setup.SyncSetup import com.mimetis.dotmim.sync.sqlite.CursorHelper.getValue -import java.io.File -import java.util.* +import com.mimetis.dotmim.sync.utcNow +import kotlinx.io.files.Path +import kotlinx.io.files.SystemFileSystem import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -104,7 +175,7 @@ abstract class BaseOrchestrator( overwrite: Boolean, schema: SyncSet, setup: SyncSetup, - provision: EnumSet, + provision: Set, scope: Any?, progress: Progress? ): SyncSet { @@ -456,7 +527,7 @@ abstract class BaseOrchestrator( this.provider.getProviderTypeName() ) - val columnNameLower = column.columnName.lowercase(Locale.getDefault()) + val columnNameLower = column.columnName.lowercase() if (columnNameLower == "sync_scope_id" || columnNameLower == "changeTable" || columnNameLower == "sync_scope_name" @@ -562,7 +633,7 @@ abstract class BaseOrchestrator( if (columnKey == null) throw MissingPrimaryKeyColumnException(rowColumn.columnName, schemaTable.tableName) - val columnNameLower = columnKey.columnName.lowercase(Locale.getDefault()) + val columnNameLower = columnKey.columnName.lowercase() if (columnNameLower == "update_scope_id" || columnNameLower == "timestamp" || columnNameLower == "timestamp_bigint" || @@ -752,7 +823,7 @@ abstract class BaseOrchestrator( setup: SyncSetup, isNew: Boolean, lastTimestamp: Long? - ): Cursor { + ): SQLiteStatement { val tableFilter: SyncFilter? val syncAdapter = this.getSyncAdapter(syncTable, setup) @@ -781,13 +852,13 @@ abstract class BaseOrchestrator( /** * Create a new SyncRow from a dataReader. */ - internal fun createSyncRowFromReader(cursor: Cursor, table: SyncTable): SyncRow { + internal fun createSyncRowFromReader(cursor: SQLiteStatement, table: SyncTable): SyncRow { // Create a new row, based on table structure val row = table.newRow() var isTombstone = false - for (i in 0 until cursor.columnCount) { + for (i in 0 until cursor.getColumnCount()) { val columnName = cursor.getColumnName(i) // if we have the tombstone value, do not add it to the table @@ -953,7 +1024,7 @@ abstract class BaseOrchestrator( if (batchInfo.inMemory) return false - val batchInfoDirectoryFullPath = File(batchInfo.getDirectoryFullPath()) + val batchInfoDirectoryFullPath = SystemFileSystem.resolve(Path( batchInfo.getDirectoryFullPath())) val (snapshotRootDirectory, snapshotNameDirectory) = this.getSnapshotDirectory() @@ -961,12 +1032,11 @@ abstract class BaseOrchestrator( if (snapshotRootDirectory.isBlank()) return true - val snapInfo = File(snapshotRootDirectory, snapshotNameDirectory).absolutePath - val snapshotDirectoryFullPath = File(snapInfo) + val snapInfo = Path(snapshotRootDirectory, snapshotNameDirectory) + val snapshotDirectoryFullPath = SystemFileSystem.resolve(snapInfo) // check if the batch dir IS NOT the snapshot directory - val canCleanFolder = - batchInfoDirectoryFullPath.absolutePath != snapshotDirectoryFullPath.absolutePath + val canCleanFolder = batchInfoDirectoryFullPath.toString() != snapshotDirectoryFullPath.toString() return canCleanFolder } @@ -996,8 +1066,7 @@ abstract class BaseOrchestrator( // cleansing scope name val directoryScopeName = context.scopeName.filter { it.isLetterOrDigit() } - val directoryFullPath = - File(this.options.snapshotsDirectory, directoryScopeName).absolutePath + val directoryFullPath = SystemFileSystem.resolve(Path(this.options.snapshotsDirectory, directoryScopeName)) val sb = StringBuilder() var underscore = "" @@ -1015,7 +1084,7 @@ abstract class BaseOrchestrator( var directoryName = sb.toString() directoryName = if (directoryName.isBlank()) "ALL" else directoryName - return Pair(directoryFullPath, directoryName) + return Pair(directoryFullPath.toString(), directoryName) } /** @@ -1578,14 +1647,14 @@ abstract class BaseOrchestrator( val changesSet = schema.schema!!.clone(false) val selectTable = DbSyncAdapter.createChangesTable(schema, changesSet) - if (!dataReader.moveToNext()) { + if (!dataReader.step()) { dataReader.close() return null } // Create a new empty row val syncRow = selectTable.newRow() - for (i in 0 until dataReader.columnCount) { + for (i in 0 until dataReader.getColumnCount()) { val columnName = dataReader.getColumnName(i) // if we have the tombstone value, do not add it to the table @@ -1748,8 +1817,9 @@ abstract class BaseOrchestrator( intercept(DatabaseChangesSelectingArgs(context, message)) // create local directory - if (message.batchSize > 0 && message.batchDirectory.isNotBlank() && !File(message.batchDirectory).exists()) { - File(message.batchDirectory).mkdir() + val batchPath = Path(message.batchDirectory) + if (message.batchSize > 0 && message.batchDirectory.isNotBlank() && !SystemFileSystem.exists(batchPath)) { + SystemFileSystem.createDirectories(batchPath) } changesSelected = DatabaseChangesSelected() @@ -1814,7 +1884,7 @@ abstract class BaseOrchestrator( // memory size total var rowsMemorySize = 0.0 - while (cursor.moveToNext()) { + while (cursor.step()) { // Log.d(TAG, "Reading ${changesSetTable.tableName} row: ${cursor.position} of ${cursor.count}") // Create a row from dataReader val row = createSyncRowFromReader(cursor, changesSetTable) @@ -1958,7 +2028,7 @@ abstract class BaseOrchestrator( ctx: SyncContext, schema: SyncSet, setup: SyncSetup, - provision: EnumSet, + provision: MutableSet, scope: Any?, progress: Progress? = null ): Boolean { @@ -1991,9 +2061,7 @@ abstract class BaseOrchestrator( val tableBuilder = this.getTableBuilder(schemaTable, setup) if (provision.contains(SyncProvision.StoredProcedures)) { - val allStoredProcedures = DbStoredProcedureType.values() - - allStoredProcedures.reverse() + val allStoredProcedures = DbStoredProcedureType.entries.reversed() for (storedProcedureType in allStoredProcedures) { // if we are iterating on bulk, but provider do not support it, just loop through and continue @@ -2227,7 +2295,7 @@ abstract class BaseOrchestrator( } companion object { - private val TAG = BaseOrchestrator::class.java.simpleName + private val TAG = BaseOrchestrator::class.simpleName } } @@ -2237,7 +2305,7 @@ abstract class BaseOrchestrator( * @param throwOnCycle if true throw exception if Cyclic dependency found * @param defaultCapacity default capacity of sorterd buffer */ -private fun List.sortByDependencies( +private fun CustomList.sortByDependencies( dependencies: (SyncTable) -> List, throwOnCycle: Boolean = false, defaultCapacity: Int = 10 diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameters.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameters.kt index 3629d92..0028303 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameters.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameters.kt @@ -1,9 +1,54 @@ package com.mimetis.dotmim.sync.parameter -import kotlinx.serialization.Serializable import com.mimetis.dotmim.sync.ArrayListLikeSerializer +import com.mimetis.dotmim.sync.set.CustomList +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.listSerialDescriptor +import kotlinx.serialization.encoding.CompositeDecoder +import kotlinx.serialization.encoding.Decoder @Serializable(with = SyncParametersSerializer::class) -class SyncParameters : ArrayList() +class SyncParameters() : CustomList() { + internal constructor(items: List) : this() { + internalList.addAll(items) + } +} + +@OptIn(ExperimentalSerializationApi::class) +object SyncParametersSerializer : ArrayListLikeSerializer(SyncParameter.serializer()) { + override val descriptor: SerialDescriptor = listSerialDescriptor() + + override fun deserialize(decoder: Decoder): SyncParameters { + val items = ArrayList() + + val compositeDecoder = decoder.beginStructure(descriptor) + + if (compositeDecoder.decodeSequentially()) { + val size = compositeDecoder.decodeCollectionSize(descriptor) + for (i in 0 until size) { + val element = compositeDecoder.decodeSerializableElement( + elementSerializer.descriptor, + i, + elementSerializer + ) + items.add(element) + } + } else { + while (true) { + val index = compositeDecoder.decodeElementIndex(elementSerializer.descriptor) + if (index == CompositeDecoder.DECODE_DONE) break + val element = compositeDecoder.decodeSerializableElement( + elementSerializer.descriptor, + index, + elementSerializer + ) + items.add(element) + } + } + compositeDecoder.endStructure(descriptor) -object SyncParametersSerializer : ArrayListLikeSerializer(SyncParameter.serializer()) + return SyncParameters(items) + } +} diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/CustomList.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/CustomList.kt index e3493e7..7c72a5b 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/CustomList.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/CustomList.kt @@ -18,5 +18,8 @@ abstract class CustomList() : Iterable { fun isEmpty(): Boolean = internalList.isEmpty() fun isNotEmpty(): Boolean = internalList.isNotEmpty() + fun addAll(items: Iterable) = internalList.addAll(items) -} \ No newline at end of file +} + +fun CustomList?.isNullOrEmpty(): Boolean = this == null || this.isEmpty() \ No newline at end of file From 1384708dafb322d5f6597f8ad22f1f237bd3a812 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 09:44:49 +0200 Subject: [PATCH 46/81] Updated provision set properties and parameters Kotlin type fixes for BaseOrchestrator --- .../mimetis/dotmim/sync/SyncTypeConverter.kt | 41 +++++++++--------- .../dotmim/sync/args/DeprovisionedArgs.kt | 3 +- .../dotmim/sync/args/DeprovisioningArgs.kt | 3 +- .../dotmim/sync/args/ProvisionedArgs.kt | 3 +- .../dotmim/sync/args/ProvisioningArgs.kt | 2 +- .../dotmim/sync/builders/DbMetadata.kt | 3 +- .../sync/orchestrators/BaseOrchestrator.kt | 2 +- .../sync/orchestrators/LocalOrchestrator.kt | 6 +-- .../dotmim/sync/serialization/DmUtils.kt | 43 ++++++++++--------- 9 files changed, 53 insertions(+), 53 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt index 919baba..b31ab45 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncTypeConverter.kt @@ -1,7 +1,8 @@ package com.mimetis.dotmim.sync -import java.math.BigDecimal -import java.util.Date +import com.ionspin.kotlin.bignum.decimal.BigDecimal +import kotlinx.datetime.LocalDateTime +import kotlin.reflect.KClass import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -17,45 +18,45 @@ object SyncTypeConverter { return value as? T } - fun tryConvertTo(value: Any?, typeOfT: Class<*>): Any? = + fun tryConvertTo(value: Any?, typeOfT: KClass<*>): Any? = when { - typeOfT == Short::class.java -> + typeOfT == Short::class -> tryConvertTo(value) - typeOfT == Int::class.java -> + typeOfT == Int::class -> tryConvertTo(value) - typeOfT == Long::class.java -> + typeOfT == Long::class -> tryConvertTo(value) - typeOfT == UShort::class.java -> + typeOfT == UShort::class -> tryConvertTo(value) - typeOfT == UInt::class.java -> + typeOfT == UInt::class -> tryConvertTo(value) - typeOfT == ULong::class.java -> + typeOfT == ULong::class -> tryConvertTo(value) - typeOfT == Date::class.java -> - tryConvertTo(value) + typeOfT == LocalDateTime::class -> + tryConvertTo(value) // typeOfT == DateTimOffset::class.java-> // tryConvertTo(value) - typeOfT == String::class.java -> + typeOfT == String::class -> tryConvertTo(value) - typeOfT == Byte::class.java -> + typeOfT == Byte::class -> tryConvertTo(value) - typeOfT == Boolean::class.java -> + typeOfT == Boolean::class -> tryConvertTo(value) - typeOfT == Uuid::class.java -> + typeOfT == Uuid::class -> tryConvertTo(value) - typeOfT == Char::class.java -> + typeOfT == Char::class -> tryConvertTo(value) - typeOfT == BigDecimal::class.java -> + typeOfT == BigDecimal::class -> tryConvertTo(value) - typeOfT == Double::class.java -> + typeOfT == Double::class -> tryConvertTo(value) - typeOfT == Float::class.java -> + typeOfT == Float::class -> tryConvertTo(value) // typeOfT == SByte::class.java-> // tryConvertTo(value) // typeOfT == TimeSpan::class.java-> // tryConvertTo(value) - typeOfT == ByteArray::class.java -> + typeOfT == ByteArray::class -> tryConvertTo(value) // typeConverter.CanConvertFrom(typeOfT) -> // Convert.ChangeType(typeConverter.ConvertFrom(value), typeOfT, provider); diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisionedArgs.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisionedArgs.kt index bc4630c..efa8416 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisionedArgs.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisionedArgs.kt @@ -4,11 +4,10 @@ import com.mimetis.dotmim.sync.SyncContext import com.mimetis.dotmim.sync.enumerations.SyncProvision import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.SyncSet -import java.util.* class DeprovisionedArgs( context: SyncContext, - val provision: EnumSet, + provision: Set, val schema: SyncSet ) : ProgressArgs(context) { override val message: String = diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisioningArgs.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisioningArgs.kt index cb69a6b..e8c75aa 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisioningArgs.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeprovisioningArgs.kt @@ -4,7 +4,6 @@ import com.mimetis.dotmim.sync.SyncContext import com.mimetis.dotmim.sync.enumerations.SyncProvision import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.SyncSet -import java.util.* class DeprovisioningArgs( context: SyncContext, @@ -12,7 +11,7 @@ class DeprovisioningArgs( /** * Get the provision type (Flag enum) */ - val provision: EnumSet, + val provision: Set, /** * Gets the schema to be applied in the database diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisionedArgs.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisionedArgs.kt index ca626a6..ceeef27 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisionedArgs.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisionedArgs.kt @@ -4,11 +4,10 @@ import com.mimetis.dotmim.sync.SyncContext import com.mimetis.dotmim.sync.enumerations.SyncProvision import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.SyncSet -import java.util.* class ProvisionedArgs( context: SyncContext, - val provision: EnumSet, + val provision: Set, val schema: SyncSet ) : ProgressArgs(context) { override val message: String diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt index 5394cf0..59b87f2 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt @@ -12,7 +12,7 @@ class ProvisioningArgs( /** * Get the provision type (Flag enum) */ - val provision: EnumSet, + val provision: Set, /** * Gets the schema to be applied in the database diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbMetadata.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbMetadata.kt index 7d4dc9e..943ca63 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbMetadata.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/DbMetadata.kt @@ -2,6 +2,7 @@ package com.mimetis.dotmim.sync.builders import com.mimetis.dotmim.sync.set.SyncColumn import com.mimetis.dotmim.sync.setup.DbType +import kotlin.reflect.KClass abstract class DbMetadata { /** @@ -22,7 +23,7 @@ abstract class DbMetadata { /** * Get a managed type from a datastore dbType */ - abstract fun validateType(ownerType: Any): Class<*> + abstract fun validateType(ownerType: Any): KClass<*> /** * Get a DbType from a datastore type name diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt index 3deb7c7..d6bc399 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt @@ -175,7 +175,7 @@ abstract class BaseOrchestrator( overwrite: Boolean, schema: SyncSet, setup: SyncSetup, - provision: Set, + provision: MutableSet, scope: Any?, progress: Progress? ): SyncSet { diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt index 057fb83..3f13689 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/LocalOrchestrator.kt @@ -408,7 +408,7 @@ class LocalOrchestrator( */ fun provision( schema: SyncSet, - provision: Set, + provision: MutableSet, overwrite: Boolean = false, clientScopeInfo: ScopeInfo? = null, progress: Progress? @@ -450,7 +450,7 @@ class LocalOrchestrator( * Deprovision the orchestrator database based on the provision enumeration */ open fun deprovision( - provision: Set, + provision: MutableSet, clientScopeInfo: ScopeInfo? = null, progress: Progress? = null ): Boolean { @@ -476,7 +476,7 @@ class LocalOrchestrator( */ fun deprovision( schema: SyncSet, - provision: Set, + provision: MutableSet, clientScopeInfo: ScopeInfo? = null, progress: Progress? = null ): Boolean { diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt index f6afb7f..a5b1356 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/serialization/DmUtils.kt @@ -1,55 +1,56 @@ package com.mimetis.dotmim.sync.serialization -import java.math.BigDecimal -import java.util.Date +import com.ionspin.kotlin.bignum.decimal.BigDecimal +import kotlinx.datetime.LocalDateTime +import kotlin.reflect.KClass import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @OptIn(ExperimentalUuidApi::class) object DmUtils { - fun getAssemblyQualifiedName(valueType: Class<*>): String = + fun getAssemblyQualifiedName(valueType: KClass<*>): String = when (valueType) { - Boolean::class.java -> + Boolean::class -> "1" - Byte::class.java -> + Byte::class -> "2" - Char::class.java -> + Char::class -> "3" - Double::class.java -> + Double::class -> "4" - Float::class.java -> + Float::class -> "5" - Int::class.java -> + Int::class -> "6" - Long::class.java -> + Long::class -> "7" - Short::class.java -> + Short::class -> "8" - UInt::class.java -> + UInt::class -> "9" - ULong::class.java -> + ULong::class -> "10" - UShort::class.java -> + UShort::class -> "11" - ByteArray::class.java -> + ByteArray::class -> "12" - Date::class.java -> + LocalDateTime::class -> "13" // DateTimeOffset::class.java -> // "14" - BigDecimal::class.java -> + BigDecimal::class -> "15" - Uuid::class.java -> + Uuid::class -> "16" - String::class.java -> + String::class -> "17" // SByte::class.java -> // "18" // TimeSpan::class.java -> // "19" - CharArray::class.java -> + CharArray::class -> "20" else -> - valueType.name + valueType.simpleName ?: valueType.toString() } } From bcfb23a1c81751b2ab39a35419342435de827db1 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 09:50:20 +0200 Subject: [PATCH 47/81] Arguments in KMP --- .../com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt | 8 ++++---- .../kotlin/com/mimetis/dotmim/sync/args/ProgressArgs.kt | 2 +- .../com/mimetis/dotmim/sync/args/ProvisioningArgs.kt | 1 - .../com/mimetis/dotmim/sync/args/SerializingSetArgs.kt | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt index aaa0d68..ca2ade4 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt @@ -3,8 +3,8 @@ package com.mimetis.dotmim.sync.args import com.mimetis.dotmim.sync.SyncContext import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.ContainerSet -import java.io.File -import java.io.FileOutputStream +import kotlinx.io.Sink +import kotlinx.io.files.Path /** * Raise just after loading a binary change set from disk, just before calling the deserializer @@ -15,7 +15,7 @@ class DeserializingSetArgs( /** * Gets the Filestream to deserialize */ - val fileStream: FileOutputStream, + val fileStream: Sink, /** * File name containing the set to be deserialized @@ -34,7 +34,7 @@ class DeserializingSetArgs( 8050 override val source: String = - if (directoryPath.isBlank()) "" else File(directoryPath).name + if (directoryPath.isBlank()) "" else Path(directoryPath).name /** * Gets or Sets the container set result, after having deserialized the FileStream. If the Result property is Null, Dotmim.Sync will deserialized the stream using a simple Json converter diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProgressArgs.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProgressArgs.kt index 08409b6..72124c2 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProgressArgs.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProgressArgs.kt @@ -18,7 +18,7 @@ open class ProgressArgs( * Gets the args type */ val typeName: String - get() = this::class.java.name + get() = this::class.simpleName ?: this::class.toString() /** * return a global message about current progress diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt index 59b87f2..25f40d4 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/ProvisioningArgs.kt @@ -4,7 +4,6 @@ import com.mimetis.dotmim.sync.SyncContext import com.mimetis.dotmim.sync.enumerations.SyncProvision import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.SyncSet -import java.util.* class ProvisioningArgs( context: SyncContext, diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SerializingSetArgs.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SerializingSetArgs.kt index ed231e0..11ac9c2 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SerializingSetArgs.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/SerializingSetArgs.kt @@ -3,7 +3,7 @@ package com.mimetis.dotmim.sync.args import com.mimetis.dotmim.sync.SyncContext import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.ContainerSet -import java.io.File +import kotlinx.io.files.Path /** * Raise before serialize a change set to get a byte array @@ -38,7 +38,7 @@ class SerializingSetArgs( 8000 override val source: String = - if (directoryPath.isBlank()) "" else File(directoryPath).name + if (directoryPath.isBlank()) "" else Path(directoryPath).name } /** From c620e9eee5b41029037334db80aea780f88d785c Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 09:50:58 +0200 Subject: [PATCH 48/81] KMP methods Ktor ConcurrentMap --- .../com/mimetis/dotmim/sync/MissingTableException.kt | 2 -- .../kotlin/com/mimetis/dotmim/sync/SyncResult.kt | 2 +- .../com/mimetis/dotmim/sync/builders/GlobalParser.kt | 4 ++-- .../mimetis/dotmim/sync/interceptors/Interceptors.kt | 4 ++-- .../kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt | 11 +++++------ .../dotmim/sync/web/client/WebClientOrchestrator.kt | 7 ++++--- 6 files changed, 14 insertions(+), 16 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTableException.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTableException.kt index f23e865..4853eff 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTableException.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/MissingTableException.kt @@ -1,6 +1,4 @@ package com.mimetis.dotmim.sync -import java.lang.Exception - class MissingTableException(tableName: String) : Exception("Table $tableName does not exists") { } diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt index ec82ea0..e3a0ec4 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncResult.kt @@ -140,7 +140,7 @@ class SyncResult( val m = moH / 60 / 1000 val moM = moH % (60 * 1000) val s = moM / 1000 - val sb = StringBuffer() + val sb = StringBuilder() if (h < 10) { sb.append(0) } diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/GlobalParser.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/GlobalParser.kt index 7257c11..1f9fca0 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/GlobalParser.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/builders/GlobalParser.kt @@ -1,9 +1,9 @@ package com.mimetis.dotmim.sync.builders -import java.util.concurrent.ConcurrentHashMap +import io.ktor.util.collections.ConcurrentMap object GlobalParser { - private val parsers = ConcurrentHashMap>() + private val parsers = ConcurrentMap>() fun getParserString(key: String): ParserString { // Try to get the instance diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/Interceptors.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/Interceptors.kt index 6148127..5f596bc 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/Interceptors.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/interceptors/Interceptors.kt @@ -1,13 +1,13 @@ package com.mimetis.dotmim.sync.interceptors import com.mimetis.dotmim.sync.args.ProgressArgs -import java.util.concurrent.ConcurrentHashMap +import io.ktor.util.collections.ConcurrentMap import kotlin.reflect.KType import kotlin.reflect.typeOf class Interceptors { @PublishedApi - internal val dictionary = ConcurrentHashMap>() + internal val dictionary = ConcurrentMap>() @Suppress("EXPERIMENTAL_API_USAGE_ERROR", "UNCHECKED_CAST") inline fun getInterceptor(): InterceptorWrapper { diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt index 10f5274..2c6de78 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt @@ -1,10 +1,9 @@ package com.mimetis.dotmim.sync.set -import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient import com.mimetis.dotmim.sync.DataRowState import com.mimetis.dotmim.sync.PrimitiveSerializer -import java.util.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @Serializable class SyncRow(@Transient val length: Int = 0) { @@ -54,7 +53,7 @@ class SyncRow(@Transient val length: Int = 0) { fun toArray(): Array { val array = Array(this.length + 1) {} - System.arraycopy(this.buffer, 0, array, 1, this.length) + buffer.copyInto(array, 1, 0) array[0] = this.rowState.value return array } @@ -68,7 +67,7 @@ class SyncRow(@Transient val length: Int = 0) { if (row.size != length + 1) throw Exception("row must contains State on position 0 and UpdateScopeId on position 1") - System.arraycopy(row, 1, buffer, 0, length) + row.copyInto(buffer, 0, 1) val drs = row[0] this.rowState = if (drs is DataRowState) { drs @@ -78,7 +77,7 @@ class SyncRow(@Transient val length: Int = 0) { } fun clear() { - Arrays.fill(buffer, null) + buffer.fill(null) //this.table = null } } diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt index 9b464ef..5258e8b 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt @@ -30,6 +30,7 @@ import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.setup.SyncSetup import com.mimetis.dotmim.sync.utcNow import io.ktor.client.HttpClient +import io.ktor.http.Url import java.io.File import java.net.URL import java.text.SimpleDateFormat @@ -192,7 +193,7 @@ class WebClientOrchestrator( // Serialize serialize(response, bpi.fileName, batchDirectoryFullPath, this) - bpi.serializedType = BatchPartInfo::class.java + bpi.serializedType = BatchPartInfo::class // Raise response from server containing a batch changes val args3 = HttpGettingServerChangesResponseArgs( @@ -463,7 +464,7 @@ class WebClientOrchestrator( // Serialize serialize(response, bpi.fileName, serverBatchInfo.getDirectoryFullPath(), this) - bpi.serializedType = BatchPartInfo::class.java + bpi.serializedType = BatchPartInfo::class // Raise response from server containing a batch changes val args3 = HttpGettingServerChangesResponseArgs( @@ -527,7 +528,7 @@ class WebClientOrchestrator( .forEach { table -> table.rows.forEach { row -> this.converter?.afterDeserialized(row) } } private fun getServiceHost() = - URL(serviceAddress).host + Url(serviceAddress).host private fun beforeSerializeRows(data: SyncSet) { data.tables From 579e378610ed85e7501867916a70b719571739dc Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 09:59:22 +0200 Subject: [PATCH 49/81] BatchPartInfo in KMP --- .../dotmim/sync/args/DeserializingSetArgs.kt | 10 +++-- .../dotmim/sync/batch/BatchPartInfo.kt | 39 ++++++++++++------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt index ca2ade4..ad2d5f0 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/args/DeserializingSetArgs.kt @@ -3,7 +3,7 @@ package com.mimetis.dotmim.sync.args import com.mimetis.dotmim.sync.SyncContext import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.ContainerSet -import kotlinx.io.Sink +import kotlinx.io.RawSink import kotlinx.io.files.Path /** @@ -15,7 +15,7 @@ class DeserializingSetArgs( /** * Gets the Filestream to deserialize */ - val fileStream: Sink, + val fileStream: RawSink, /** * File name containing the set to be deserialized @@ -26,7 +26,7 @@ class DeserializingSetArgs( * Directory containing the file, about to be deserialized */ val directoryPath: String -) : ProgressArgs(context) { +) : ProgressArgs(context), AutoCloseable { override val message: String = "[$fileName] Deserializing Set." @@ -40,6 +40,10 @@ class DeserializingSetArgs( * Gets or Sets the container set result, after having deserialized the FileStream. If the Result property is Null, Dotmim.Sync will deserialized the stream using a simple Json converter */ var result: ContainerSet? = null + + override fun close() { + fileStream.close() + } } /** diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt index 200cea1..6b6d2cb 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchPartInfo.kt @@ -1,14 +1,22 @@ package com.mimetis.dotmim.sync.batch -import kotlinx.serialization.* -import kotlinx.serialization.json.Json import com.mimetis.dotmim.sync.MissingFileException import com.mimetis.dotmim.sync.args.DeserializingSetArgs import com.mimetis.dotmim.sync.args.SerializingSetArgs import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.ContainerSet import com.mimetis.dotmim.sync.set.SyncSet -import java.io.File +import io.ktor.utils.io.core.toByteArray +import io.ktor.utils.io.readText +import kotlinx.io.buffered +import kotlinx.io.bytestring.ByteString +import kotlinx.io.files.Path +import kotlinx.io.files.SystemFileSystem +import kotlinx.io.write +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import kotlinx.serialization.json.Json import kotlin.reflect.KClass /** @@ -92,11 +100,11 @@ class BatchPartInfo { if (fileName.isBlank()) throw Exception("ArgumentNullException: fileName") - val file = File(directoryFullPath, fileName) + val file = Path(directoryFullPath, fileName) //val fullPath = Path.Combine(directoryFullPath, fileName) - if (!file.exists()) - throw MissingFileException(file.absolutePath) + if (!SystemFileSystem.exists(file)) + throw MissingFileException(file.toString()) //var jsonConverter = new Utf8JsonConverter() @@ -109,7 +117,7 @@ class BatchPartInfo { if (orchestrator != null) { val interceptorArgs = DeserializingSetArgs( orchestrator.getContext(), - file.outputStream(), + SystemFileSystem.sink(file), fileName, directoryFullPath ) @@ -122,10 +130,11 @@ class BatchPartInfo { ignoreUnknownKeys = true isLenient = true } + val jsonText = SystemFileSystem.source(file).use { it.buffered().readText() } set = if (serializedType == ContainerSet::class) { - json.decodeFromString(file.readText()) + json.decodeFromString(jsonText) } else { - val jsonString: ContainerSetBoilerPlate = json.decodeFromString(file.readText()) + val jsonString: ContainerSetBoilerPlate = json.decodeFromString(jsonText) jsonString.changes } } @@ -146,12 +155,12 @@ class BatchPartInfo { if (set == null) return - val dir = File(directoryFullPath) + val dir = Path(directoryFullPath) - if (!dir.exists()) - dir.mkdir() + if (!SystemFileSystem.exists(dir)) + SystemFileSystem.createDirectories(dir) - val file = File(directoryFullPath, fileName) + val file = Path(directoryFullPath, fileName) var serializedBytes: ByteArray? = null @@ -171,7 +180,9 @@ class BatchPartInfo { serializedBytes = jsonString.toByteArray() } - file.writeBytes(serializedBytes) + SystemFileSystem.sink(file).use { + it.buffered().write(ByteString(serializedBytes)) + } } /** From e9e5978740ee915db8f32ac8a51e09ded906735a Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 11:26:30 +0200 Subject: [PATCH 50/81] WebClientOrchestrator with KMP --- .../mimetis/dotmim/sync/batch/BatchInfo.kt | 115 +++++++++++++++--- .../sync/web/client/WebClientOrchestrator.kt | 69 +++++++---- 2 files changed, 143 insertions(+), 41 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt index 5aa0865..2ba19d7 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt @@ -4,13 +4,17 @@ import com.mimetis.dotmim.sync.DbSyncAdapter import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.set.SyncTable +import kotlinx.datetime.Clock +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.TimeZone +import kotlinx.datetime.format.char +import kotlinx.datetime.toLocalDateTime +import kotlinx.io.IOException +import kotlinx.io.files.Path +import kotlinx.io.files.SystemFileSystem import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient -import java.io.File -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -54,7 +58,7 @@ class BatchInfo() { /** * List of batch parts if not in memory */ - @SerialName("parts") + @SerialName("parts") var batchPartsInfo: ArrayList? = null /** @@ -78,19 +82,36 @@ class BatchInfo() { /** * Create a new BatchInfo, containing all BatchPartInfo */ - constructor(inMemory: Boolean, inSchema: SyncSet, rootDirectory: String = "", directoryName: String = "") : this() { + constructor( + inMemory: Boolean, + inSchema: SyncSet, + rootDirectory: String = "", + directoryName: String = "" + ) : this() { this.inMemory = inMemory // We need to create a change table set, containing table with columns not readonly for (table in inSchema.tables) - DbSyncAdapter.createChangesTable(inSchema.tables[table.tableName, table.schemaName]!!, this.sanitizedSchema) + DbSyncAdapter.createChangesTable( + inSchema.tables[table.tableName, table.schemaName]!!, + this.sanitizedSchema + ) // If not in memory, generate a directory name and initialize batch parts list if (!this.inMemory) { this.directoryRoot = rootDirectory this.batchPartsInfo = ArrayList() this.directoryName = if (directoryName.isNotBlank()) - SimpleDateFormat("yyyy_MM_dd_ss", Locale.getDefault()).format(Calendar.getInstance(Locale.getDefault()).time) + LocalDateTime.Format { + year() + char('_') + monthNumber() + char('_') + dayOfMonth() + char('_') + second() + char('_') + }.format(Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault())) else directoryName } @@ -99,7 +120,12 @@ class BatchInfo() { /** * Add changes to batch info. */ - fun addChanges(changes: SyncSet, batchIndex: Int = 0, isLastBatch: Boolean = true, orchestrator: BaseOrchestrator? = null) { + fun addChanges( + changes: SyncSet, + batchIndex: Int = 0, + isLastBatch: Boolean = true, + orchestrator: BaseOrchestrator? = null + ) { if (this.inMemory) { this.serializerFactoryKey = null this.inMemoryData = changes @@ -107,7 +133,14 @@ class BatchInfo() { // this.serializerFactoryKey = serializerFactoryKey.key val bpId = generateNewFileName(batchIndex.toString()) //var fileName = Path.Combine(this.GetDirectoryFullPath(), bpId) - val bpi = BatchPartInfo.createBatchPartInfo(batchIndex, changes, bpId, getDirectoryFullPath(), isLastBatch, orchestrator) + val bpi = BatchPartInfo.createBatchPartInfo( + batchIndex, + changes, + bpId, + getDirectoryFullPath(), + isLastBatch, + orchestrator + ) // add the batchpartinfo tp the current batchinfo this.batchPartsInfo?.add(bpi) @@ -118,7 +151,10 @@ class BatchInfo() { * Get the full path of the Batch directory */ fun getDirectoryFullPath(): String = - if (inMemory) "" else File(directoryRoot, directoryName).absolutePath + if (inMemory) + "" + else + Path(directoryRoot, directoryName).toString() /** * Ensure the last batch part (if not in memory) has the correct IsLastBatch flag @@ -214,13 +250,33 @@ class BatchInfo() { fun tryRemoveDirectory() { // Once we have applied all the batch, we can safely remove the temp dir and all it's files if (!this.inMemory && this.directoryRoot.isNotBlank() && this.directoryName.isBlank()) { - val tmpDirectory = File(this.getDirectoryFullPath()) + val tmpDirectory = Path(this.getDirectoryFullPath()) - if (!tmpDirectory.exists()) + if (!SystemFileSystem.exists(tmpDirectory)) return try { - tmpDirectory.deleteRecursively() + val stack = ArrayList() + stack.add(tmpDirectory) + while (stack.isNotEmpty()) { + val path = stack.first() + val children = try { + SystemFileSystem.list(path) + } catch (_: IOException) { + // Not a directory + SystemFileSystem.delete(path) + stack.remove(path) + continue + } catch (_: Throwable) { + emptyList() + } + if (children.isEmpty()) { + SystemFileSystem.delete(path) + stack.remove(path) + } else { + stack.addAll(children) + } + } } // do nothing here catch (e: Exception) { @@ -228,7 +284,11 @@ class BatchInfo() { } } - fun getTable(tableName: String, schemaName: String, orchestrator: BaseOrchestrator? = null): List { + fun getTable( + tableName: String, + schemaName: String, + orchestrator: BaseOrchestrator? = null + ): List { if (this.sanitizedSchema == null) throw NullPointerException("Batch info schema should not be null") @@ -240,18 +300,35 @@ class BatchInfo() { return listOf(this.inMemoryData!!.tables[tableName, schemaName]!!) } else { val bpiTables = batchPartsInfo - ?.filter { bpi -> bpi.rowsCount > 0 && bpi.tables!!.any { t -> t.equalsByName(tableInfo) } } - ?.sortedBy { t -> t.index } + ?.filter { bpi -> + bpi.rowsCount > 0 && bpi.tables!!.any { t -> + t.equalsByName( + tableInfo + ) + } + } + ?.sortedBy { t -> t.index } if (bpiTables != null) { return bpiTables.mapNotNull { batchPartinInfo -> // load only if not already loaded in memory if (batchPartinInfo.data == null) - batchPartinInfo.loadBatch(this.sanitizedSchema, getDirectoryFullPath(), orchestrator) + batchPartinInfo.loadBatch( + this.sanitizedSchema, + getDirectoryFullPath(), + orchestrator + ) // Get the table from the batchPartInfo // generate a tmp SyncTable for - val batchTable = batchPartinInfo.data?.tables?.firstOrNull { bt -> bt.equalsByName(SyncTable(tableName, schemaName)) } + val batchTable = batchPartinInfo.data?.tables?.firstOrNull { bt -> + bt.equalsByName( + SyncTable( + tableName, + schemaName + ) + ) + } if (batchTable != null) { diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt index 5258e8b..5fa2001 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt @@ -31,11 +31,14 @@ import com.mimetis.dotmim.sync.setup.SyncSetup import com.mimetis.dotmim.sync.utcNow import io.ktor.client.HttpClient import io.ktor.http.Url -import java.io.File -import java.net.URL -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale +import kotlinx.datetime.Clock +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.TimeZone +import kotlinx.datetime.format.char +import kotlinx.datetime.toLocalDateTime +import kotlinx.io.buffered +import kotlinx.io.files.Path +import kotlinx.io.files.SystemFileSystem import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -47,7 +50,7 @@ class WebClientOrchestrator( private val converter: Converter? = null, private val maxDownladingDegreeOfParallelism: Int = 4 ) : RemoteOrchestrator(FancyCoreProvider(), SyncOptions(), SyncSetup()) { -// private val TAG = this::class.java.simpleName + // private val TAG = this::class.java.simpleName private val service = DotmimServiceImpl(serviceAddress, client) /** @@ -146,10 +149,20 @@ class WebClientOrchestrator( // Generate a batch directory val batchDirectoryRoot = this.options.batchDirectory - val batchDirectoryName = SimpleDateFormat("yyyy_MM_dd_ss", Locale.getDefault()).format( - Calendar.getInstance(Locale.getDefault()).time - ) + Uuid.random().toString().replace(".", "") - val batchDirectoryFullPath = File(batchDirectoryRoot, batchDirectoryName).absolutePath + val batchDirectoryName = + LocalDateTime.Format { + year() + char('_') + monthNumber() + char('_') + dayOfMonth() + char('_') + second() + char('_') + }.format(Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault())) + + Uuid.random().toString().replace(".", "") + + val batchDirectoryFullPath = Path(batchDirectoryRoot, batchDirectoryName) // Create the BatchInfo serialized (forced because in a snapshot call, so we are obviously serialized on disk) val serverBatchInfo = BatchInfo(false, schema!!, batchDirectoryRoot, batchDirectoryName) @@ -185,7 +198,12 @@ class WebClientOrchestrator( // val binaryData3 = await serializer3.SerializeAsync(changesToSend3) // val step3 = HttpStep.GetMoreChanges - val args2 = HttpGettingServerChangesRequestArgs(bpi.index, serverBatchInfo.batchPartsInfo!!.size, summaryResponseContent.syncContext, this.getServiceHost()) + val args2 = HttpGettingServerChangesRequestArgs( + bpi.index, + serverBatchInfo.batchPartsInfo!!.size, + summaryResponseContent.syncContext, + this.getServiceHost() + ) this.intercept(args2) val response = service.moreChanges(authHeader, changesToSend3, converter) @@ -423,9 +441,18 @@ class WebClientOrchestrator( // Generate the batch directory val batchDirectoryRoot = this.options.batchDirectory - val batchDirectoryName = SimpleDateFormat("yyyy_MM_dd_ss", Locale.getDefault()).format( - Calendar.getInstance(Locale.getDefault()).time - ) + Uuid.random().toString().replace(".", "") + val batchDirectoryName = + LocalDateTime.Format { + year() + char('_') + monthNumber() + char('_') + dayOfMonth() + char('_') + second() + char('_') + }.format(Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault())) + + Uuid.random().toString().replace(".", "") serverBatchInfo.directoryRoot = batchDirectoryRoot serverBatchInfo.directoryName = batchDirectoryName @@ -462,7 +489,7 @@ class WebClientOrchestrator( val response = service.moreChanges(authHeader, changesToSend3, converter) // Serialize - serialize(response, bpi.fileName, serverBatchInfo.getDirectoryFullPath(), this) + serialize(response, bpi.fileName, Path(serverBatchInfo.getDirectoryFullPath()), this) bpi.serializedType = BatchPartInfo::class @@ -541,14 +568,12 @@ class WebClientOrchestrator( private fun serialize( data: ByteArray, fileName: String, - directoryFullPath: String, + directoryFullPath: Path, orchestrator: BaseOrchestrator ) { - val dir = File(directoryFullPath) - if (dir.isDirectory && !dir.exists()) - dir.mkdir() - - val file = File(directoryFullPath, fileName) - file.writeBytes(data) + SystemFileSystem.createDirectories(directoryFullPath) + SystemFileSystem.sink(Path(directoryFullPath, fileName)).use { + it.buffered().write(data) + } } } From 23b836af2a4676b0943cfd495ba5d3db609a8ea3 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 11:43:54 +0200 Subject: [PATCH 51/81] Updated PrimitiveSerializer Updated iOS platform --- .../com/mimetis/dotmim/sync/PrimitiveSerializer.kt | 12 +++++++++--- .../kotlin/com/mimetis/dotmimsync/Platform.ios.kt | 14 +++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt index 28f57c5..e8e3cff 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/PrimitiveSerializer.kt @@ -1,8 +1,8 @@ package com.mimetis.dotmim.sync -import android.util.Base64 import kotlinx.datetime.LocalDateTime import kotlinx.datetime.format +import kotlinx.datetime.format.FormatStringsInDatetimeFormats import kotlinx.datetime.format.byUnicodePattern import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.InternalSerializationApi @@ -25,10 +25,16 @@ import kotlinx.serialization.json.intOrNull import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.long import kotlinx.serialization.json.longOrNull +import kotlin.io.encoding.Base64 +import kotlin.io.encoding.ExperimentalEncodingApi import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid -@OptIn(ExperimentalUuidApi::class) +@OptIn( + ExperimentalUuidApi::class, + FormatStringsInDatetimeFormats::class, + ExperimentalEncodingApi::class +) @ExperimentalSerializationApi object PrimitiveSerializer : KSerializer { private val dateFormat = LocalDateTime.Format { byUnicodePattern("yyyy-MM-dd'T'HH:mm:ss") } @@ -46,7 +52,7 @@ object PrimitiveSerializer : KSerializer { is Long -> encoder.encodeLong(value) is Double -> encoder.encodeDouble(value) is Float -> encoder.encodeFloat(value) - is ByteArray -> encoder.encodeString(Base64.encodeToString(value, Base64.NO_WRAP)) + is ByteArray -> encoder.encodeString(Base64.encode(value)) is Uuid -> encoder.encodeString(value.toString().uppercase()) is LocalDateTime -> encoder.encodeString(value.format(dateFormat)) else -> encoder.encodeString(value.toString()) diff --git a/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt b/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt index 4c54d26..f3088c6 100644 --- a/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt +++ b/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt @@ -1,14 +1,14 @@ package com.mimetis.dotmimsync -import platform.Foundation.NSString -import platform.Foundation.stringWithFormat -import platform.Foundation.stringWithString import platform.UIKit.UIDevice -class IOSPlatform: Platform { - override val name: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion +class IOSPlatform : Platform { + override val name: String = + UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion + override fun formatString(format: String, vararg args: Any?): String = - NSString.stringWithFormat(format, args) + TODO("Not implemented") +// NSString.create(format= format, locale = null, arguments = args) ?: "" } -actual fun getPlatform(): Platform = IOSPlatform() \ No newline at end of file +actual fun getPlatform(): Platform = IOSPlatform() From 471024bff0043907aac665021711f6ab314b78ee Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 11:45:48 +0200 Subject: [PATCH 52/81] Updated PrimitiveSerializer Updated platform string formatting --- .../com/mimetis/dotmimsync/Platform.android.kt | 2 +- .../kotlin/com/mimetis/dotmim/sync/Platform.kt | 2 +- .../dotmim/sync/sqlite/SqliteTableBuilder.kt | 15 ++++++++------- .../kotlin/com/mimetis/dotmimsync/Platform.ios.kt | 6 ++++-- .../com/mimetis/dotmim/sync/Platform.jvm.kt | 2 +- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/dotmimsync-core/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt b/dotmimsync-core/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt index e09a9f7..4e2d3ca 100644 --- a/dotmimsync-core/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt +++ b/dotmimsync-core/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt @@ -2,7 +2,7 @@ package com.mimetis.dotmimsync class AndroidPlatform : Platform { override val name: String = "Android ${android.os.Build.VERSION.SDK_INT}" - override fun formatString(format: String, vararg args: Any?): String = + override fun formatString(format: String, vararg args: String?): String = String.format(format, args) } diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt index c8dd0e9..30cb877 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt @@ -2,7 +2,7 @@ package com.mimetis.dotmimsync interface Platform { val name: String - fun formatString(format: String, vararg args: Any?): String + fun formatString(format: String, vararg args: String?): String } expect fun getPlatform(): Platform diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt index 6926622..88ede46 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt @@ -355,8 +355,8 @@ class SqliteTableBuilder( } override fun existsTriggerCommand(triggerType: DbTriggerType): Boolean { - val commandTriggerName = - currentPlatform.formatString(getTriggerCommandName(triggerType), tableName.unquoted().toString()) + val commandTriggerName = getTriggerCommandName(triggerType) +// currentPlatform.formatString(getTriggerCommandName(triggerType), tableName.unquoted().toString()) val triggerName = ParserName.parse(commandTriggerName).toString() return database.prepare( @@ -378,13 +378,14 @@ class SqliteTableBuilder( private lateinit var triggersNames: Map private fun initTriggerNames() { - val tpref = if (this.setup.triggersPrefix.isNotBlank()) this.setup.triggersPrefix else "" - val tsuf = if (this.setup.triggersSuffix.isNotBlank()) this.setup.triggersSuffix else "" + val tpref = this.setup.triggersPrefix + val tsuf = this.setup.triggersSuffix + val tblName = tableName.unquoted().normalized() triggersNames = hashMapOf( - DbTriggerType.Insert to "[${tpref}${tableName.unquoted().normalized()}${tsuf}_insert_trigger]", - DbTriggerType.Update to "[${tpref}${tableName.unquoted().normalized()}${tsuf}_update_trigger]", - DbTriggerType.Delete to "[${tpref}${tableName.unquoted().normalized()}${tsuf}_delete_trigger]", + DbTriggerType.Insert to "[$tpref$tblName${tsuf}_insert_trigger]", + DbTriggerType.Update to "[$tpref$tblName${tsuf}_update_trigger]", + DbTriggerType.Delete to "[$tpref$tblName${tsuf}_delete_trigger]", ) } diff --git a/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt b/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt index f3088c6..999fe73 100644 --- a/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt +++ b/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt @@ -1,13 +1,15 @@ package com.mimetis.dotmimsync +import platform.Foundation.NSString +import platform.Foundation.stringWithFormat import platform.UIKit.UIDevice class IOSPlatform : Platform { override val name: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion - override fun formatString(format: String, vararg args: Any?): String = - TODO("Not implemented") + override fun formatString(format: String, vararg args: String?): String = + NSString.stringWithFormat(format, args) // NSString.create(format= format, locale = null, arguments = args) ?: "" } diff --git a/dotmimsync-core/src/jvmMain/kotlin/com/mimetis/dotmim/sync/Platform.jvm.kt b/dotmimsync-core/src/jvmMain/kotlin/com/mimetis/dotmim/sync/Platform.jvm.kt index 6c0d86d..6f96c0f 100644 --- a/dotmimsync-core/src/jvmMain/kotlin/com/mimetis/dotmim/sync/Platform.jvm.kt +++ b/dotmimsync-core/src/jvmMain/kotlin/com/mimetis/dotmim/sync/Platform.jvm.kt @@ -2,7 +2,7 @@ package com.mimetis.dotmimsync class JvmPlatform : Platform { override val name: String = "Java ${System.getProperty("java.version")}" - override fun formatString(format: String, vararg args: Any?): String = + override fun formatString(format: String, vararg args: String?): String = String.format(format, args) } From 98fa80ee24a32d2168a72c3e8303073dc343b25d Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 11:52:09 +0200 Subject: [PATCH 53/81] Removed platform string formatting --- .../kotlin/com/mimetis/dotmimsync/Platform.android.kt | 2 -- .../commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt | 1 - .../iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt | 6 ------ .../jvmMain/kotlin/com/mimetis/dotmim/sync/Platform.jvm.kt | 2 -- 4 files changed, 11 deletions(-) diff --git a/dotmimsync-core/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt b/dotmimsync-core/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt index 4e2d3ca..2638faf 100644 --- a/dotmimsync-core/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt +++ b/dotmimsync-core/src/androidMain/kotlin/com/mimetis/dotmimsync/Platform.android.kt @@ -2,8 +2,6 @@ package com.mimetis.dotmimsync class AndroidPlatform : Platform { override val name: String = "Android ${android.os.Build.VERSION.SDK_INT}" - override fun formatString(format: String, vararg args: String?): String = - String.format(format, args) } actual fun getPlatform(): Platform = AndroidPlatform() \ No newline at end of file diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt index 30cb877..cab21e1 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Platform.kt @@ -2,7 +2,6 @@ package com.mimetis.dotmimsync interface Platform { val name: String - fun formatString(format: String, vararg args: String?): String } expect fun getPlatform(): Platform diff --git a/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt b/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt index 999fe73..2e6346b 100644 --- a/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt +++ b/dotmimsync-core/src/iosMain/kotlin/com/mimetis/dotmimsync/Platform.ios.kt @@ -1,16 +1,10 @@ package com.mimetis.dotmimsync -import platform.Foundation.NSString -import platform.Foundation.stringWithFormat import platform.UIKit.UIDevice class IOSPlatform : Platform { override val name: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion - - override fun formatString(format: String, vararg args: String?): String = - NSString.stringWithFormat(format, args) -// NSString.create(format= format, locale = null, arguments = args) ?: "" } actual fun getPlatform(): Platform = IOSPlatform() diff --git a/dotmimsync-core/src/jvmMain/kotlin/com/mimetis/dotmim/sync/Platform.jvm.kt b/dotmimsync-core/src/jvmMain/kotlin/com/mimetis/dotmim/sync/Platform.jvm.kt index 6f96c0f..7b209ec 100644 --- a/dotmimsync-core/src/jvmMain/kotlin/com/mimetis/dotmim/sync/Platform.jvm.kt +++ b/dotmimsync-core/src/jvmMain/kotlin/com/mimetis/dotmim/sync/Platform.jvm.kt @@ -2,8 +2,6 @@ package com.mimetis.dotmimsync class JvmPlatform : Platform { override val name: String = "Java ${System.getProperty("java.version")}" - override fun formatString(format: String, vararg args: String?): String = - String.format(format, args) } actual fun getPlatform(): Platform = JvmPlatform() \ No newline at end of file From 5ce27e6c5094c84e0fd781ee7db6bc2d4918e76a Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 12:06:37 +0200 Subject: [PATCH 54/81] Added branch build script --- .github/workflows/branch.yaml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/branch.yaml diff --git a/.github/workflows/branch.yaml b/.github/workflows/branch.yaml new file mode 100644 index 0000000..811a89c --- /dev/null +++ b/.github/workflows/branch.yaml @@ -0,0 +1,26 @@ +name: KMP branch build + +on: + push: + branches: main + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: set up JDK + uses: actions/setup-java@v4 + with: + java-version: '18' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew +# - name: Build with Gradle +# run: | +# ./gradlew wrapper --gradle-version 8.7.2 --distribution-type bin +# ./gradlew build + - name: Build snapshot + run: ./gradlew publishAllPublicationsToMavenCentralRepository --no-configuration-cache From 299e97511b50526f73f131d22507b22e50e03614 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 12:14:18 +0200 Subject: [PATCH 55/81] Fixed yaml syntax --- .github/workflows/branch.yaml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/branch.yaml b/.github/workflows/branch.yaml index 811a89c..190310c 100644 --- a/.github/workflows/branch.yaml +++ b/.github/workflows/branch.yaml @@ -6,21 +6,21 @@ on: jobs: build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: set up JDK - uses: actions/setup-java@v4 - with: - java-version: '18' - distribution: 'temurin' - cache: gradle + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: set up JDK + uses: actions/setup-java@v4 + with: + java-version: '18' + distribution: 'temurin' + cache: gradle - - name: Grant execute permission for gradlew - run: chmod +x gradlew -# - name: Build with Gradle -# run: | -# ./gradlew wrapper --gradle-version 8.7.2 --distribution-type bin -# ./gradlew build - - name: Build snapshot - run: ./gradlew publishAllPublicationsToMavenCentralRepository --no-configuration-cache + - name: Grant execute permission for gradlew + run: chmod +x gradlew +# - name: Build with Gradle +# run: | +# ./gradlew wrapper --gradle-version 8.7.2 --distribution-type bin +# ./gradlew build + - name: Build snapshot + run: ./gradlew publishAllPublicationsToMavenCentralRepository --no-configuration-cache From 67eee255f2cfa5b2f1724b89df93794f2f47ed95 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 16:43:56 +0200 Subject: [PATCH 56/81] Trying another apg version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fdd45d8..3531471 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.7.2" +agp = "8.5.0" kotlin = "2.1.10" serialization = "1.8.0" kotlinx-datetime = "0.6.2" From e8e714e8c889544a68c14a21ce4090ff1846fc51 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 16:48:30 +0200 Subject: [PATCH 57/81] Updated branch build policy --- .github/workflows/branch.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/branch.yaml b/.github/workflows/branch.yaml index 190310c..cb72ab2 100644 --- a/.github/workflows/branch.yaml +++ b/.github/workflows/branch.yaml @@ -2,7 +2,10 @@ name: KMP branch build on: push: - branches: main + branches: + - !main + - '!release/**' + workflow_dispatch: jobs: build: From 78f17261e66868d6d013557f6fc1b3857aa98cd9 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 17:08:44 +0200 Subject: [PATCH 58/81] Delete .github/workflows/branch.yaml --- .github/workflows/branch.yaml | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 .github/workflows/branch.yaml diff --git a/.github/workflows/branch.yaml b/.github/workflows/branch.yaml deleted file mode 100644 index cb72ab2..0000000 --- a/.github/workflows/branch.yaml +++ /dev/null @@ -1,29 +0,0 @@ -name: KMP branch build - -on: - push: - branches: - - !main - - '!release/**' - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: set up JDK - uses: actions/setup-java@v4 - with: - java-version: '18' - distribution: 'temurin' - cache: gradle - - - name: Grant execute permission for gradlew - run: chmod +x gradlew -# - name: Build with Gradle -# run: | -# ./gradlew wrapper --gradle-version 8.7.2 --distribution-type bin -# ./gradlew build - - name: Build snapshot - run: ./gradlew publishAllPublicationsToMavenCentralRepository --no-configuration-cache From 3f3bbf6cf3dba901557dfff92f0bd063a3e190f7 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 6 Apr 2025 20:29:19 +0200 Subject: [PATCH 59/81] Added version suffix --- dotmimsync-core/build.gradle.kts | 5 +++++ gradle.properties | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index fbb5be3..3253c25 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -87,11 +87,16 @@ android { } } +val versionSuffix: String by project + publishing.publications .withType() .configureEach { groupId = "io.github.vunder.dotmimsync" version = "1.1.0-kmp.alpha0" + if (versionSuffix.isNotBlank()) { + version += "-$versionSuffix" + } pom { name = "dotmimsync" diff --git a/gradle.properties b/gradle.properties index 7f53ad4..de37871 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,4 +8,6 @@ kotlin.code.style=official #Android android.useAndroidX=true -android.nonTransitiveRClass=true \ No newline at end of file +android.nonTransitiveRClass=true + +versionSuffix= \ No newline at end of file From eede34b105e2d62b77410a90437e0b91066a54ba Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Thu, 1 May 2025 21:14:53 +0200 Subject: [PATCH 60/81] Update dependencies --- dotmimsync-core/build.gradle.kts | 19 +++++++++++-------- gradle/libs.versions.toml | 4 ++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index 3253c25..e04820a 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -44,19 +44,22 @@ kotlin { implementation(libs.androidx.sqlite.bundled) implementation(libs.ktor.client.core) - implementation(libs.ktor.client.content.negotiation) - implementation(libs.ktor.serialization.kotlinx.json) +// implementation(libs.ktor.client.content.negotiation) +// implementation(libs.ktor.serialization.kotlinx.json) implementation(libs.kotlin.bignum) implementation(libs.kotlin.bignum.serialization) implementation(kotlincrypto.hash.sha2) } - androidMain.dependencies { - implementation(libs.ktor.client.okhttp) - } - iosMain.dependencies { +// androidMain.dependencies { +// implementation(libs.ktor.client.okhttp) +// } +// iosMain.dependencies { // implementation(libs.ktor.client.darwin) - } +// } +// jvmMain.dependencies { +// implementation(libs.ktor.client.okhttp) +// } commonTest.dependencies { implementation(libs.kotlin.test) } @@ -93,7 +96,7 @@ publishing.publications .withType() .configureEach { groupId = "io.github.vunder.dotmimsync" - version = "1.1.0-kmp.alpha0" + version = "1.1.0-kmp.alpha1" if (versionSuffix.isNotBlank()) { version += "-$versionSuffix" } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3531471..051ad9a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,9 @@ [versions] agp = "8.5.0" -kotlin = "2.1.10" +kotlin = "2.1.20" serialization = "1.8.0" kotlinx-datetime = "0.6.2" -sqlite = "2.5.0-rc03" +sqlite = "2.5.0" ktor = "3.1.1" vanniktech = "0.31.0" bignum = "0.3.10" From 9e7accf53f317bb18ce566b79bbbaa45685d5053 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Fri, 2 May 2025 16:42:59 +0200 Subject: [PATCH 61/81] Fixed sql statement reusage --- .../kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt index 1ff1e06..7f84f8b 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteQueryWrapper.kt @@ -52,6 +52,7 @@ class SqliteQueryWrapper( order = second } } else { + statement?.reset() statement?.clearBindings() } From f19793669414c2bda53f9e2ff1ba8cb74958e6eb Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Fri, 2 May 2025 18:31:56 +0200 Subject: [PATCH 62/81] Fixed row data copy --- .../commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRows.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRows.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRows.kt index b70be84..fdd2850 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRows.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRows.kt @@ -39,7 +39,7 @@ class SyncRows() : CustomList() { if (!checkType) { // System.arraycopy(row, 1, itemArray, 0, length) - row.copyInto(itemArray, 0, 1, length - 1) + row.copyInto(itemArray, 0, 1) } else { // Get only writable columns val columns = table!!.getMutableColumnsWithPrimaryKeys() From 59196fc866f9d70477bfe6ef2e2d126ac5f5acff Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Fri, 2 May 2025 18:39:04 +0200 Subject: [PATCH 63/81] Updating version with the fixes --- dotmimsync-core/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index e04820a..4dfaef6 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -96,7 +96,7 @@ publishing.publications .withType() .configureEach { groupId = "io.github.vunder.dotmimsync" - version = "1.1.0-kmp.alpha1" + version = "1.1.0-kmp.alpha2" if (versionSuffix.isNotBlank()) { version += "-$versionSuffix" } From fab4450a119138cc7926a8855c0a21fe82c4097b Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Fri, 2 May 2025 18:41:27 +0200 Subject: [PATCH 64/81] Ignore updates --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 012ae8e..146151d 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ xcuserdata /publish-and-release.sh /snapshot.sh /publish-only.sh +/local-build.sh \ No newline at end of file From 388f2653c8d883226ae3647718c78540acadc3bd Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Fri, 2 May 2025 22:40:26 +0200 Subject: [PATCH 65/81] Fixed load of table columns --- .../dotmim/sync/sqlite/SqliteTableBuilder.kt | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt index 88ede46..a79612e 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt @@ -11,7 +11,6 @@ import com.mimetis.dotmim.sync.set.SyncColumn import com.mimetis.dotmim.sync.set.SyncTable import com.mimetis.dotmim.sync.setup.DbType import com.mimetis.dotmim.sync.setup.SyncSetup -import com.mimetis.dotmimsync.currentPlatform class SqliteTableBuilder( tableDescription: SyncTable, @@ -413,9 +412,7 @@ class SqliteTableBuilder( // val commandColumn = "SELECT * FROM pragma_table_info('$unquotedTableName');" val commandColumn = "pragma table_info('$unquotedTableName');" val syncTable = SyncTable(unquotedTableName, "") - database.prepare(commandColumn).use { cursor -> - cursor.step() - syncTable.load(cursor) } + database.prepare(commandColumn).use { cursor -> syncTable.load(cursor) } return syncTable } @@ -430,7 +427,7 @@ class SqliteTableBuilder( ): String { // We MUST check if we are from the same provider (if it's mysql or oracle, we fallback on dbtype if (originalDbType.isNotBlank() && fromProviderType == ownerProviderType) { - val ownedDbType = validateOwnerDbType(originalDbType, isUnsigned, isUnicode, maxLength) + val ownedDbType = validateOwnerDbType(originalDbType, isUnsigned, isUnicode, maxLength) return when (ownedDbType) { SqliteType.Integer -> "integer" SqliteType.Real -> "numeric" @@ -476,10 +473,12 @@ class SqliteTableBuilder( DbType.Time, DbType.DateTimeOffset -> "text" + DbType.Guid, DbType.Binary, DbType.Object -> "blob" + DbType.Boolean, DbType.Byte, DbType.Int16, @@ -490,16 +489,19 @@ class SqliteTableBuilder( DbType.UInt64, DbType.SByte -> "integer" + DbType.Date, DbType.DateTime, DbType.DateTime2 -> "datetime" + DbType.Decimal, DbType.Double, DbType.Single, DbType.Currency, DbType.VarNumeric -> "real" + else -> throw Exception("this DbType ${dbType} is not supported") } @@ -522,22 +524,29 @@ class SqliteTableBuilder( when (typeName.lowercase()) { "bit" -> return DbType.Boolean + "integer", "bigint" -> return DbType.Int64 + "numeric", "real", "float" -> return DbType.Double + "decimal" -> return DbType.Decimal + "blob", "image" -> return DbType.Binary + "datetime" -> return DbType.DateTime + "time" -> return DbType.Time + "text", "varchar" -> return DbType.String @@ -561,13 +570,16 @@ class SqliteTableBuilder( "integer", "bigint" -> return SqliteType.Integer + "numeric", "decimal", "real" -> return SqliteType.Real + "blob", "image" -> return SqliteType.Blob + "datetime", "text" -> return SqliteType.Text From 31fbf1bc5f66d4829e920e381b04667cadd33876 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sat, 3 May 2025 07:54:30 +0200 Subject: [PATCH 66/81] Replace Enum.values() with Enum.entries Removed unused DateSerializer Fixed sync headers interception to avoid double converted and has headers --- .../com/mimetis/dotmim/sync/DateSerializer.kt | 24 ------------------- .../com/mimetis/dotmim/sync/SyncContext.kt | 6 ++--- .../sync/orchestrators/BaseOrchestrator.kt | 4 ++-- .../dotmim/sync/parameter/SyncParameter.kt | 1 + .../mimetis/dotmim/sync/set/ContainerTable.kt | 2 ++ .../com/mimetis/dotmim/sync/set/SyncColumn.kt | 2 +- .../com/mimetis/dotmim/sync/set/SyncRow.kt | 4 +++- .../dotmim/sync/sqlite/SqliteTableBuilder.kt | 3 +-- .../sync/web/client/DotmimServiceImpl.kt | 8 +++---- .../web/client/HttpMessageSummaryResponse.kt | 2 +- 10 files changed, 18 insertions(+), 38 deletions(-) delete mode 100644 dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt deleted file mode 100644 index 2034fe0..0000000 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/DateSerializer.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.mimetis.dotmim.sync - -import kotlinx.datetime.LocalDateTime -import kotlinx.datetime.format -import kotlinx.datetime.format.byUnicodePattern -import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder - -internal object DateSerializer : KSerializer { - private val dateFormat = - LocalDateTime.Format { byUnicodePattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSX") } - - override val descriptor = - PrimitiveSerialDescriptor("com.mimetis.dotmim.sync.LocalDateTime", PrimitiveKind.STRING) - - override fun deserialize(decoder: Decoder): LocalDateTime = - LocalDateTime.parse(decoder.decodeString(), dateFormat) - - override fun serialize(encoder: Encoder, value: LocalDateTime) = - encoder.encodeString(value.format(dateFormat)) -} diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt index 95f9024..78916c4 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/SyncContext.kt @@ -24,13 +24,13 @@ class SyncContext( var clientScopeId: Uuid? = null, @SerialName("typ") - var syncType: SyncType = SyncType.values()[0], + var syncType: SyncType = SyncType.entries[0], @SerialName("way") - var syncWay: SyncWay = SyncWay.values()[0], + var syncWay: SyncWay = SyncWay.entries[0], @SerialName("stage") - var syncStage: SyncStage = SyncStage.values()[0], + var syncStage: SyncStage = SyncStage.entries[0], @SerialName("ps") var parameters: SyncParameters? = null, diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt index d6bc399..74c2f48 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/orchestrators/BaseOrchestrator.kt @@ -765,7 +765,7 @@ abstract class BaseOrchestrator( ): Boolean { var hasCreatedAtLeastOneTrigger = false - val listTriggerType = DbTriggerType.values() + val listTriggerType = DbTriggerType.entries for (triggerType in listTriggerType) { val exists = tableBuilder.existsTrigger(triggerType) @@ -2093,7 +2093,7 @@ abstract class BaseOrchestrator( } if (provision.contains(SyncProvision.Triggers)) { - for (triggerType in DbTriggerType.values()) { + for (triggerType in DbTriggerType.entries) { val exists = internalExistsTrigger(ctx, tableBuilder, triggerType, progress) // Drop trigger if already exists diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameter.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameter.kt index 01d8fa1..9d173d2 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameter.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/parameter/SyncParameter.kt @@ -3,6 +3,7 @@ package com.mimetis.dotmim.sync.parameter import kotlinx.serialization.* import com.mimetis.dotmim.sync.PrimitiveSerializer +@OptIn(ExperimentalSerializationApi::class) @Serializable class SyncParameter( @SerialName("pn") diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt index 95d33c4..c9c0162 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/ContainerTable.kt @@ -4,12 +4,14 @@ import com.ionspin.kotlin.bignum.decimal.BigDecimal import com.mimetis.dotmim.sync.PrimitiveSerializer import com.mimetis.dotmim.sync.serialization.DmUtils import kotlinx.datetime.LocalDateTime +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlin.reflect.KClass import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid +@OptIn(ExperimentalSerializationApi::class) @Serializable class ContainerTable( @SerialName("n") diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt index 4e19ca3..d5ca6d2 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncColumn.kt @@ -182,7 +182,7 @@ class SyncColumn( } fun getDbType(): DbType = - DbType.values()[this.dbType] + DbType.entries[this.dbType] /** * Get auto inc values, coercing Step diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt index 2c6de78..50c4e5d 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/set/SyncRow.kt @@ -2,9 +2,11 @@ package com.mimetis.dotmim.sync.set import com.mimetis.dotmim.sync.DataRowState import com.mimetis.dotmim.sync.PrimitiveSerializer +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable import kotlinx.serialization.Transient +@OptIn(ExperimentalSerializationApi::class) @Serializable class SyncRow(@Transient val length: Int = 0) { private var buffer: Array<@Serializable(with = PrimitiveSerializer::class) Any?> = @@ -72,7 +74,7 @@ class SyncRow(@Transient val length: Int = 0) { this.rowState = if (drs is DataRowState) { drs } else { - DataRowState.values().first { it.value == drs } + DataRowState.entries.first { it.value == drs } } } diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt index a79612e..c63807c 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/sqlite/SqliteTableBuilder.kt @@ -75,7 +75,6 @@ class SqliteTableBuilder( "pragma table_info('${unquotedTableName}');" ).use { cursor -> val columns = cursor.getColumnNames() - cursor.step() keys.load(cursor) { c -> c.getInt(columns.indexOf("pk")) == 1 } } @@ -435,7 +434,7 @@ class SqliteTableBuilder( SqliteType.Blob -> "blob" else -> throw Exception("this SqliteType ${ownedDbType} is not supported") } - return getStringFromOwnerDbType(ownedDbType)//DbType.values()[ownedDbType.ordinal]) + return getStringFromOwnerDbType(ownedDbType)//DbType.entries[ownedDbType.ordinal]) } // if it's not the same provider, fallback on DbType instead. diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt index 7102e8d..1482c33 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt @@ -7,7 +7,7 @@ import io.ktor.client.plugins.HttpSend import io.ktor.client.plugins.plugin import io.ktor.client.request.post import io.ktor.client.request.setBody -import io.ktor.client.statement.readBytes +import io.ktor.client.statement.readRawBytes import io.ktor.http.ContentType import io.ktor.http.HttpHeaders import io.ktor.http.content.OutgoingContent @@ -106,7 +106,7 @@ internal class DotmimServiceImpl( contentType(ContentType.Application.Json) setBody(args) - }.readBytes() + }.readRawBytes() suspend fun endDownloadChanges( authHeader: String, @@ -145,12 +145,12 @@ internal class DotmimServiceImpl( init { val md = SHA256() client.plugin(HttpSend).intercept { request -> - request.headers.append("dotmim-sync-serialization-format", """{"f":"json", "s":0}""") + request.headers["dotmim-sync-serialization-format"] = """{"f":"json", "s":0}""" if (request.body is OutgoingContent.ByteArrayContent) { val bytes = (request.body as OutgoingContent.ByteArrayContent).bytes() val digest = md.digest(bytes) val hash = digest.encodeBase64() - request.headers.append("dotmim-sync-hash", hash) + request.headers["dotmim-sync-hash"] = hash } execute(request) } diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSummaryResponse.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSummaryResponse.kt index 65205a4..9bd1dcf 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSummaryResponse.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/HttpMessageSummaryResponse.kt @@ -45,5 +45,5 @@ class HttpMessageSummaryResponse( var clientChangesApplied: DatabaseChangesApplied, @SerialName("crp") - var conflictResolutionPolicy: ConflictResolutionPolicy = ConflictResolutionPolicy.values()[0] + var conflictResolutionPolicy: ConflictResolutionPolicy = ConflictResolutionPolicy.entries[0] ) From e80165b2f2e165f2084ff5773f7384b7acaac222 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sat, 3 May 2025 16:05:42 +0200 Subject: [PATCH 67/81] Version update --- dotmimsync-core/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index 4dfaef6..9bb5d13 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -96,7 +96,7 @@ publishing.publications .withType() .configureEach { groupId = "io.github.vunder.dotmimsync" - version = "1.1.0-kmp.alpha2" + version = "1.1.0-kmp.alpha3" if (versionSuffix.isNotBlank()) { version += "-$versionSuffix" } From 69825c1382cfcd94ec3aa81929cc2e4b73f501d1 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sat, 3 May 2025 16:17:44 +0200 Subject: [PATCH 68/81] Readme update --- README.md | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b22669c..b3f8c4e 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Release](https://jitpack.io/v/vunder/dotmimsync.svg)](https://jitpack.io/vunder/dotmimsync) [![](https://jitci.com/gh/vunder/dotmimsync/svg)](https://jitci.com/gh/vunder/dotmimsync) -Android (Kotlin) port for [Dotmim.Sync](https://github.com/Mimetis/Dotmim.Sync) C# library. Original library documentation can be found [here](https://dotmimsync.readthedocs.io/) +Kotlin Multiplatform port for [Dotmim.Sync](https://github.com/Mimetis/Dotmim.Sync) C# library. Original library documentation can be found [here](https://dotmimsync.readthedocs.io/) ## Adding dependencies @@ -24,6 +24,29 @@ and add library dependency to your app build.gradle } ``` +```kotlin + BundledSQLiteDriver().open(databaseFullPath).use { sqliteConnection -> + val syncSetup = SyncSetup() // fill sync tables info + val serverOrchestrator = WebClientOrchestrator( + "http://your-server-api", + httpClient, // injected on created Ktor HttpClient instance + authHeader // server authentication header, e.g. "Bearer " + ) + val clientProvider = SqliteSyncProvider(sqliteConnection) + val syncOptions = SyncOptions(useVerboseErrors = true) + val agent = SyncAgent(clientProvider, serverOrchestrator, syncOptions, syncSetup) + val progress = object : Progress { + override fun report(value: ProgressArgs) { + Log.d( + "sync-progress", + "LOCAL[${value.eventId}]. ${value.context.syncStage}: ${value.message} ${value.progressPercentage * 100}% (${value.hint})(${value.context.sessionId})" + ) + } + } + val syncResult = agent.synchronize(progress = progress) + } +``` + ## Library usage General use-cases you can find in original library documentation @@ -32,7 +55,7 @@ General use-cases you can find in original library documentation ## Dotmim.Sync version match table Here is a version match table. Left column represent current library, right column - Dotmim.Sync library -|Library version|Dotmim.Sync version| -|-|-| -|1.0-1.0.10|0.9.1 or lower| -|1.1.0|0.9.1 or lower| \ No newline at end of file +| Library version |Dotmim.Sync version| +|----------------|-| +| 1.0-1.1.0 |0.9.1 or lower| +| 1.1.0 |0.9.1 or lower| \ No newline at end of file From 3ef6caf94d0ae5ea3f2bc5a6b172195b966e1e9c Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 11 May 2025 07:18:23 +0200 Subject: [PATCH 69/81] Sqlite update --- dotmimsync-core/build.gradle.kts | 2 +- gradle/libs.versions.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index 9bb5d13..653000e 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -96,7 +96,7 @@ publishing.publications .withType() .configureEach { groupId = "io.github.vunder.dotmimsync" - version = "1.1.0-kmp.alpha3" + version = "1.1.0-kmp.beta1" if (versionSuffix.isNotBlank()) { version += "-$versionSuffix" } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 051ad9a..55281c0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ agp = "8.5.0" kotlin = "2.1.20" serialization = "1.8.0" kotlinx-datetime = "0.6.2" -sqlite = "2.5.0" +sqlite = "2.5.1" ktor = "3.1.1" vanniktech = "0.31.0" bignum = "0.3.10" From 132484d61048367c229e2e409c1f2e409f2304c1 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 25 May 2025 20:59:51 +0200 Subject: [PATCH 70/81] Library updates --- dotmimsync-core/build.gradle.kts | 13 +------------ gradle/libs.versions.toml | 16 ++++------------ 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index 653000e..e20a745 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -44,22 +44,11 @@ kotlin { implementation(libs.androidx.sqlite.bundled) implementation(libs.ktor.client.core) -// implementation(libs.ktor.client.content.negotiation) -// implementation(libs.ktor.serialization.kotlinx.json) implementation(libs.kotlin.bignum) implementation(libs.kotlin.bignum.serialization) implementation(kotlincrypto.hash.sha2) } -// androidMain.dependencies { -// implementation(libs.ktor.client.okhttp) -// } -// iosMain.dependencies { -// implementation(libs.ktor.client.darwin) -// } -// jvmMain.dependencies { -// implementation(libs.ktor.client.okhttp) -// } commonTest.dependencies { implementation(libs.kotlin.test) } @@ -96,7 +85,7 @@ publishing.publications .withType() .configureEach { groupId = "io.github.vunder.dotmimsync" - version = "1.1.0-kmp.beta1" + version = "1.1.0-kmp.beta2" if (versionSuffix.isNotBlank()) { version += "-$versionSuffix" } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 55281c0..6ab61cc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,11 +1,11 @@ [versions] agp = "8.5.0" -kotlin = "2.1.20" -serialization = "1.8.0" +kotlin = "2.1.21" +serialization = "1.8.1" kotlinx-datetime = "0.6.2" sqlite = "2.5.1" -ktor = "3.1.1" -vanniktech = "0.31.0" +ktor = "3.1.3" +vanniktech = "0.32.0" bignum = "0.3.10" [libraries] @@ -18,21 +18,13 @@ kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version. androidx-sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" } -ktor-client-darwin = { module = "io.ktor:ktor-client-darvin", version.ref = "ktor" } ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } -ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } -ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } -ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } kotlin-bignum = { module = "com.ionspin.kotlin:bignum", version.ref = "bignum" } kotlin-bignum-serialization = { module = "com.ionspin.kotlin:bignum-serialization-kotlinx", version.ref = "bignum" } [plugins] androidLibrary = { id = "com.android.library", version.ref = "agp" } -kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } -kotlinCocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" } -compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } -jetbrains-kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } vanniktech-maven-publish = { id = "com.vanniktech.maven.publish", version.ref = "vanniktech" } From 6fba0a47daacf104b173ece94977dc6a99eae23f Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sat, 31 May 2025 08:16:14 +0200 Subject: [PATCH 71/81] Updating version due to wrong push to maven --- dotmimsync-core/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index e20a745..29cd9c9 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -85,7 +85,7 @@ publishing.publications .withType() .configureEach { groupId = "io.github.vunder.dotmimsync" - version = "1.1.0-kmp.beta2" + version = "1.1.1-beta3" if (versionSuffix.isNotBlank()) { version += "-$versionSuffix" } From 3fd1e6056d50ac08c7da38323eb9396b21c3eebb Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Mon, 16 Jun 2025 16:35:45 +0200 Subject: [PATCH 72/81] Updated ktor to 3.2.0 --- dotmimsync-core/build.gradle.kts | 2 +- gradle/libs.versions.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index 29cd9c9..537dec5 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -85,7 +85,7 @@ publishing.publications .withType() .configureEach { groupId = "io.github.vunder.dotmimsync" - version = "1.1.1-beta3" + version = "1.1.1-beta4" if (versionSuffix.isNotBlank()) { version += "-$versionSuffix" } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6ab61cc..d48720d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ kotlin = "2.1.21" serialization = "1.8.1" kotlinx-datetime = "0.6.2" sqlite = "2.5.1" -ktor = "3.1.3" +ktor = "3.2.0" vanniktech = "0.32.0" bignum = "0.3.10" From 68028307140d0a26fa7f810eeb0b900335e24fd6 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Sun, 22 Jun 2025 21:27:29 +0200 Subject: [PATCH 73/81] Upgrading sqlite, downgrading ktor due to error in it --- dotmimsync-core/build.gradle.kts | 2 +- gradle/libs.versions.toml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index 537dec5..fe1ed2d 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -85,7 +85,7 @@ publishing.publications .withType() .configureEach { groupId = "io.github.vunder.dotmimsync" - version = "1.1.1-beta4" + version = "1.1.1-beta5" if (versionSuffix.isNotBlank()) { version += "-$versionSuffix" } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d48720d..2fa6920 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,9 +3,9 @@ agp = "8.5.0" kotlin = "2.1.21" serialization = "1.8.1" kotlinx-datetime = "0.6.2" -sqlite = "2.5.1" -ktor = "3.2.0" -vanniktech = "0.32.0" +sqlite = "2.5.2" +ktor = "3.1.3" +vanniktech = "0.33.0" bignum = "0.3.10" [libraries] From c176ad7f5fc4776e938664bdffa6acb36aae0fcb Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Mon, 7 Jul 2025 20:27:23 +0200 Subject: [PATCH 74/81] AGP and Ktor update --- gradle/libs.versions.toml | 6 +++--- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2fa6920..e602698 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,10 @@ [versions] -agp = "8.5.0" -kotlin = "2.1.21" +agp = "8.11.0" +kotlin = "2.2.0" serialization = "1.8.1" kotlinx-datetime = "0.6.2" sqlite = "2.5.2" -ktor = "3.1.3" +ktor = "3.2.1" vanniktech = "0.33.0" bignum = "0.3.10" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5a50784..83de9b3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sun Dec 01 10:12:16 CET 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 9f0f9753923829e990f7f8afa968debcfbe38534 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Tue, 8 Jul 2025 08:04:16 +0200 Subject: [PATCH 75/81] Version update --- dotmimsync-core/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index fe1ed2d..e2adece 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -85,7 +85,7 @@ publishing.publications .withType() .configureEach { groupId = "io.github.vunder.dotmimsync" - version = "1.1.1-beta5" + version = "1.1.1-beta6" if (versionSuffix.isNotBlank()) { version += "-$versionSuffix" } From 02c60e80026424c2b4ddcaf3306f76670d78d3c2 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Tue, 8 Jul 2025 08:05:36 +0200 Subject: [PATCH 76/81] Fixed SonatypeHost deprecation CompileSdk set to 36 --- dotmimsync-core/build.gradle.kts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index e2adece..0be703c 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -1,4 +1,3 @@ -import com.vanniktech.maven.publish.SonatypeHost import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -57,7 +56,7 @@ kotlin { android { namespace = "com.mimetis.dotmimsync" - compileSdk = 35 + compileSdk = 36 defaultConfig { minSdk = 26 } @@ -143,6 +142,6 @@ publishing { } mavenPublishing { - publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL, automaticRelease = false) + publishToMavenCentral(automaticRelease = false) signAllPublications() } \ No newline at end of file From 4275ae97dd33bab0fecff229303a9ac310f498b9 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Thu, 17 Jul 2025 16:28:41 +0200 Subject: [PATCH 77/81] Updated kotlinx.datetime, serialization and ktor --- dotmimsync-core/build.gradle.kts | 5 ++++- gradle/libs.versions.toml | 8 ++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index 0be703c..5e2879c 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -78,13 +78,14 @@ android { } } +val libVersion = "1.1.1-beta7" val versionSuffix: String by project publishing.publications .withType() .configureEach { groupId = "io.github.vunder.dotmimsync" - version = "1.1.1-beta6" + version = libVersion if (versionSuffix.isNotBlank()) { version += "-$versionSuffix" } @@ -142,6 +143,8 @@ publishing { } mavenPublishing { + coordinates("io.github.vunder.dotmimsync", "dotmimsync-core", libVersion) + publishToMavenCentral(automaticRelease = false) signAllPublications() } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e602698..d181cc6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,11 +1,11 @@ [versions] agp = "8.11.0" kotlin = "2.2.0" -serialization = "1.8.1" -kotlinx-datetime = "0.6.2" +serialization = "1.9.0" +kotlinx-datetime = "0.7.1" sqlite = "2.5.2" -ktor = "3.2.1" -vanniktech = "0.33.0" +ktor = "3.2.2" +vanniktech = "0.34.0" bignum = "0.3.10" [libraries] From 19037eece29608bbec668f86e0d798c021774bc4 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Thu, 17 Jul 2025 16:32:25 +0200 Subject: [PATCH 78/81] Fixed build --- .../kotlin/com/mimetis/dotmim/sync/Extensions.kt | 4 +++- .../kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt | 6 ++++-- .../dotmim/sync/web/client/WebClientOrchestrator.kt | 9 +++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt index f634e2c..67b7914 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/Extensions.kt @@ -1,5 +1,7 @@ package com.mimetis.dotmim.sync -import kotlinx.datetime.Clock +import kotlin.time.Clock +import kotlin.time.ExperimentalTime +@OptIn(ExperimentalTime::class) fun utcNow(): Long = Clock.System.now().toEpochMilliseconds() diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt index 2ba19d7..8e3cd31 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/batch/BatchInfo.kt @@ -4,7 +4,6 @@ import com.mimetis.dotmim.sync.DbSyncAdapter import com.mimetis.dotmim.sync.orchestrators.BaseOrchestrator import com.mimetis.dotmim.sync.set.SyncSet import com.mimetis.dotmim.sync.set.SyncTable -import kotlinx.datetime.Clock import kotlinx.datetime.LocalDateTime import kotlinx.datetime.TimeZone import kotlinx.datetime.format.char @@ -15,12 +14,15 @@ import kotlinx.io.files.SystemFileSystem import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient +import kotlin.time.Clock +import kotlin.time.ExperimentalTime import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid /** * Represents a Batch, containing a full or serialized change set */ +@OptIn(ExperimentalTime::class) @Serializable class BatchInfo() { /** @@ -107,7 +109,7 @@ class BatchInfo() { char('_') monthNumber() char('_') - dayOfMonth() + day() char('_') second() char('_') diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt index 5fa2001..dc5a276 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/WebClientOrchestrator.kt @@ -31,7 +31,6 @@ import com.mimetis.dotmim.sync.setup.SyncSetup import com.mimetis.dotmim.sync.utcNow import io.ktor.client.HttpClient import io.ktor.http.Url -import kotlinx.datetime.Clock import kotlinx.datetime.LocalDateTime import kotlinx.datetime.TimeZone import kotlinx.datetime.format.char @@ -39,10 +38,12 @@ import kotlinx.datetime.toLocalDateTime import kotlinx.io.buffered import kotlinx.io.files.Path import kotlinx.io.files.SystemFileSystem +import kotlin.time.Clock +import kotlin.time.ExperimentalTime import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid -@OptIn(ExperimentalUuidApi::class) +@OptIn(ExperimentalUuidApi::class, ExperimentalTime::class) class WebClientOrchestrator( private val serviceAddress: String, client: HttpClient, @@ -155,7 +156,7 @@ class WebClientOrchestrator( char('_') monthNumber() char('_') - dayOfMonth() + day() char('_') second() char('_') @@ -447,7 +448,7 @@ class WebClientOrchestrator( char('_') monthNumber() char('_') - dayOfMonth() + day() char('_') second() char('_') From 7e6928716cebf17971bd5a583da30a4839d332f0 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Wed, 24 Sep 2025 20:03:21 +0200 Subject: [PATCH 79/81] Library updates --- dotmimsync-core/build.gradle.kts | 2 +- gradle/libs.versions.toml | 6 +++--- settings.gradle.kts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index 5e2879c..e3a93d9 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -78,7 +78,7 @@ android { } } -val libVersion = "1.1.1-beta7" +val libVersion = "1.1.1-beta8" val versionSuffix: String by project publishing.publications diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d181cc6..ef5f6b2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,10 @@ [versions] agp = "8.11.0" -kotlin = "2.2.0" +kotlin = "2.2.20" serialization = "1.9.0" kotlinx-datetime = "0.7.1" -sqlite = "2.5.2" -ktor = "3.2.2" +sqlite = "2.6.0" +ktor = "3.3.0" vanniktech = "0.34.0" bignum = "0.3.10" diff --git a/settings.gradle.kts b/settings.gradle.kts index eb4095f..e5c0297 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,7 +17,7 @@ dependencyResolutionManagement { versionCatalogs { create("kotlincrypto") { // https://github.com/KotlinCrypto/version-catalog/blob/master/gradle/kotlincrypto.versions.toml - from("org.kotlincrypto:version-catalog:0.7.0") + from("org.kotlincrypto:version-catalog:0.8.0") } } } From 0487851baa207f8e27a65cf7b259724e9f6c5048 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Tue, 14 Oct 2025 15:59:19 +0200 Subject: [PATCH 80/81] Ktor and sqlite version update Added timeouts --- dotmimsync-core/build.gradle.kts | 2 +- .../dotmim/sync/web/client/DotmimServiceImpl.kt | 13 +++++++++++++ gradle/libs.versions.toml | 4 ++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/dotmimsync-core/build.gradle.kts b/dotmimsync-core/build.gradle.kts index e3a93d9..cf78560 100644 --- a/dotmimsync-core/build.gradle.kts +++ b/dotmimsync-core/build.gradle.kts @@ -78,7 +78,7 @@ android { } } -val libVersion = "1.1.1-beta8" +val libVersion = "1.1.1-beta9" val versionSuffix: String by project publishing.publications diff --git a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt index 1482c33..7008bfd 100644 --- a/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt +++ b/dotmimsync-core/src/commonMain/kotlin/com/mimetis/dotmim/sync/web/client/DotmimServiceImpl.kt @@ -5,6 +5,7 @@ import io.ktor.client.HttpClient import io.ktor.client.call.body import io.ktor.client.plugins.HttpSend import io.ktor.client.plugins.plugin +import io.ktor.client.plugins.timeout import io.ktor.client.request.post import io.ktor.client.request.setBody import io.ktor.client.statement.readRawBytes @@ -89,6 +90,9 @@ internal class DotmimServiceImpl( contentType(ContentType.Application.Json) setBody(args) + timeout { + socketTimeoutMillis = 10 * 60 * 1000 + } }.body() suspend fun moreChanges( @@ -106,6 +110,9 @@ internal class DotmimServiceImpl( contentType(ContentType.Application.Json) setBody(args) + timeout { + socketTimeoutMillis = 10 * 60 * 1000 + } }.readRawBytes() suspend fun endDownloadChanges( @@ -123,6 +130,9 @@ internal class DotmimServiceImpl( contentType(ContentType.Application.Json) setBody(args) + timeout { + socketTimeoutMillis = 10 * 60 * 1000 + } }.body() suspend fun getSummary( @@ -140,6 +150,9 @@ internal class DotmimServiceImpl( contentType(ContentType.Application.Json) setBody(args) + timeout { + socketTimeoutMillis = 10 * 60 * 1000 + } }.body() init { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ef5f6b2..4aae19b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,8 +3,8 @@ agp = "8.11.0" kotlin = "2.2.20" serialization = "1.9.0" kotlinx-datetime = "0.7.1" -sqlite = "2.6.0" -ktor = "3.3.0" +sqlite = "2.6.1" +ktor = "3.3.1" vanniktech = "0.34.0" bignum = "0.3.10" From 7016a6955f20a97fdc87e00d9c5ca1a5ec6e0923 Mon Sep 17 00:00:00 2001 From: Aleksei Starchikov Date: Tue, 6 Jan 2026 10:00:31 +0100 Subject: [PATCH 81/81] Updating dependencies --- gradle/libs.versions.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4aae19b..c60cd30 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,11 +1,11 @@ [versions] -agp = "8.11.0" -kotlin = "2.2.20" +agp = "8.13.2" +kotlin = "2.3.0" serialization = "1.9.0" kotlinx-datetime = "0.7.1" -sqlite = "2.6.1" -ktor = "3.3.1" -vanniktech = "0.34.0" +sqlite = "2.6.2" +ktor = "3.3.3" +vanniktech = "0.35.0" bignum = "0.3.10" [libraries] @@ -27,4 +27,4 @@ kotlin-bignum-serialization = { module = "com.ionspin.kotlin:bignum-serializatio androidLibrary = { id = "com.android.library", version.ref = "agp" } kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } -vanniktech-maven-publish = { id = "com.vanniktech.maven.publish", version.ref = "vanniktech" } +vanniktech-maven-publish = { id = "com.vanniktech.maven.publish", version.ref = "vanniktech" } \ No newline at end of file