From 9e6505a9303aea5d64d938d586d4c7954a2dd48f Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Wed, 25 Jul 2018 15:26:48 -0700 Subject: [PATCH 1/7] [sdks/android] Pre: Fix unused warnings. --- src/store.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/store.rs b/src/store.rs index de86f6da..314e0a48 100644 --- a/src/store.rs +++ b/src/store.rs @@ -41,8 +41,6 @@ use mentat_db::{ #[cfg(feature = "syncable")] use mentat_tolstoy::Syncer; -use uuid::Uuid; - use conn::{ CacheAction, CacheDirection, @@ -51,7 +49,11 @@ use conn::{ InProgressRead, Pullable, Queryable, - Syncable +}; + +#[cfg(feature = "syncable")] +use conn::{ + Syncable, }; use errors::*; @@ -238,6 +240,9 @@ impl Pullable for Store { } } +#[cfg(feature = "syncable")] +use uuid::Uuid; + #[cfg(feature = "syncable")] impl Syncable for Store { fn sync(&mut self, server_uri: &String, user_uuid: &String) -> Result<()> { @@ -266,6 +271,8 @@ mod tests { Duration, }; + use uuid::Uuid; + use mentat_db::cache::{ SQLiteAttributeCache, }; From 0955c784b7b5296db5efa4aaec5483a6c5562e6a Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Tue, 17 Jul 2018 16:42:36 -0700 Subject: [PATCH 2/7] [sdks/android] Pre: Trim unused Android bits. We don't use UI libraries, don't require UI resources, and don't require any permissions. --- sdks/android/Mentat/library/build.gradle | 7 ------- sdks/android/Mentat/library/src/main/AndroidManifest.xml | 4 +--- .../android/Mentat/library/src/main/res/values/strings.xml | 3 --- sdks/android/Mentat/samples/basic/build.gradle | 2 ++ 4 files changed, 3 insertions(+), 13 deletions(-) delete mode 100644 sdks/android/Mentat/library/src/main/res/values/strings.xml diff --git a/sdks/android/Mentat/library/build.gradle b/sdks/android/Mentat/library/build.gradle index b8a82ec1..24632eef 100644 --- a/sdks/android/Mentat/library/build.gradle +++ b/sdks/android/Mentat/library/build.gradle @@ -34,16 +34,9 @@ android { } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { - exclude group: 'com.android.support', module: 'support-annotations' - }) androidTestImplementation 'com.android.support:support-annotations:27.1.1' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test:rules:1.0.2' - implementation 'com.android.support:appcompat-v7:27.1.1' - implementation 'com.android.support.constraint:constraint-layout:1.1.0' - implementation 'com.android.support:design:27.1.1' testImplementation 'junit:junit:4.12' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'net.java.dev.jna:jna:4.5.1' diff --git a/sdks/android/Mentat/library/src/main/AndroidManifest.xml b/sdks/android/Mentat/library/src/main/AndroidManifest.xml index 51e1ff81..a83569b2 100644 --- a/sdks/android/Mentat/library/src/main/AndroidManifest.xml +++ b/sdks/android/Mentat/library/src/main/AndroidManifest.xml @@ -1,6 +1,4 @@ - - - \ No newline at end of file + diff --git a/sdks/android/Mentat/library/src/main/res/values/strings.xml b/sdks/android/Mentat/library/src/main/res/values/strings.xml deleted file mode 100644 index 30b035ae..00000000 --- a/sdks/android/Mentat/library/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Mentat - diff --git a/sdks/android/Mentat/samples/basic/build.gradle b/sdks/android/Mentat/samples/basic/build.gradle index 49fa1822..3c7808a2 100644 --- a/sdks/android/Mentat/samples/basic/build.gradle +++ b/sdks/android/Mentat/samples/basic/build.gradle @@ -31,6 +31,8 @@ dependencies { implementation project(':library') implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "com.android.support:appcompat-v7:27.1.1" + implementation 'com.android.support.constraint:constraint-layout:1.1.0' + implementation 'com.android.support:design:27.1.1' } repositories { From 67a14ca756bceab9b3dcdc1f94b6b261a50d170f Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Wed, 18 Jul 2018 15:05:44 -0700 Subject: [PATCH 3/7] [sdks/android] Build Mentat Android SDK in TaskCluster; publish org.mozilla.mentat to nalexander's personal Bintray repo. The automation parts were cribbed directly from https://github.com/mozilla-mobile/android-components/tree/50add3e176e038c6630ab3612268feb156d33984. The automation permissions were added in https://bugzilla.mozilla.org/show_bug.cgi?id=1477311. This uses a very rudimentary Gradle plugin, `rust-android-gradle`, with custom fixes and extensions. It works pretty well for what it is! See https://github.com/ncalexan/rust-android-gradle. --- .taskcluster.yml | 80 ++++++++++++ CHANGELOG.md | 11 ++ Cargo.toml | 2 +- automation/docker/Dockerfile | 95 ++++++++++++++ .../taskcluster/decision_task_pull_request.py | 122 ++++++++++++++++++ .../release/fetch-bintray-api-key.py | 28 ++++ sdks/android/Mentat/build.gradle | 25 +++- sdks/android/Mentat/gradle.properties | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- sdks/android/Mentat/library/build.gradle | 77 +++++------ .../src/main/jniLibs/arm64/libmentat_ffi.so | 1 - .../src/main/jniLibs/armeabi/libmentat_ffi.so | 1 - .../src/main/jniLibs/x86/libmentat_ffi.so | 1 - sdks/android/Mentat/publish.gradle | 99 ++++++++++++++ 14 files changed, 492 insertions(+), 58 deletions(-) create mode 100644 .taskcluster.yml create mode 100644 CHANGELOG.md create mode 100644 automation/docker/Dockerfile create mode 100644 automation/taskcluster/decision_task_pull_request.py create mode 100644 automation/taskcluster/release/fetch-bintray-api-key.py delete mode 120000 sdks/android/Mentat/library/src/main/jniLibs/arm64/libmentat_ffi.so delete mode 120000 sdks/android/Mentat/library/src/main/jniLibs/armeabi/libmentat_ffi.so delete mode 120000 sdks/android/Mentat/library/src/main/jniLibs/x86/libmentat_ffi.so create mode 100644 sdks/android/Mentat/publish.gradle diff --git a/.taskcluster.yml b/.taskcluster.yml new file mode 100644 index 00000000..51b74009 --- /dev/null +++ b/.taskcluster.yml @@ -0,0 +1,80 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +version: 0 +allowPullRequests: public +tasks: +#################################################################################################### +# Task: Pull requests +#################################################################################################### + - provisionerId: '{{ taskcluster.docker.provisionerId }}' + workerType: '{{ taskcluster.docker.workerType }}' + extra: + github: + env: true + events: + - pull_request.opened + - pull_request.edited + - pull_request.synchronize + - pull_request.reopened + - push + scopes: + - "queue:create-task:aws-provisioner-v1/github-worker" + - "queue:scheduler-id:taskcluster-github" + payload: + maxRunTime: 3600 + deadline: "{{ '2 hours' | $fromNow }}" + image: 'mozillamobile/mentat:1.1' + command: + - /bin/bash + - '--login' + - '-cx' + - >- + export TERM=dumb + && git fetch {{ event.head.repo.url }} {{ event.head.repo.branch }} + && git config advice.detachedHead false + && git checkout {{event.head.sha}} + && python automation/taskcluster/decision_task_pull_request.py + features: + taskclusterProxy: true + metadata: + name: Mentat Android SDK - Pull Request + description: Building and testing the Mentat Android SDK - triggered by a pull request. + owner: '{{ event.head.user.email }}' + source: '{{ event.head.repo.url }}' +#################################################################################################### +# Task: Release +#################################################################################################### + - provisionerId: '{{ taskcluster.docker.provisionerId }}' + workerType: '{{ taskcluster.docker.workerType }}' + extra: + github: + events: + - release + scopes: + - "secrets:get:project/mentat/publish" + payload: + maxRunTime: 3600 + deadline: "{{ '2 hours' | $fromNow }}" + image: 'mozillamobile/mentat:1.1' + command: + - /bin/bash + - '--login' + - '-cx' + - >- + export TERM=dumb + && git fetch origin --tags + && git config advice.detachedHead false + && git checkout {{ event.version }} + && python automation/taskcluster/release/fetch-bintray-api-key.py + && cd sdks/android/Mentat + && ./gradlew --no-daemon clean library:assembleRelease + && ./gradlew bintrayUpload --debug + features: + taskclusterProxy: true + metadata: + name: Mentat Android SDK - Release ({{ event.version }}) + description: Building and publishing release versions. + owner: '{{ event.head.user.email }}' + source: '{{ event.head.repo.url }}' diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..255ddcd3 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# 0.9 (2018-07-25) + +* sdks/android compiled against: + * Kotlin standard library 1.2.41 + +* **API changes**: + * Mentat partitions now enforce their integrity, denying entids that aren't already known. + +* **sdks/android**: First version published to nalexander's personal bintray repository. +* Various bugfixes and refactorings (see commits below for details) +* [Commits](https://github.com/mozilla-mobile/android-components/compare/v0.8.1...v0.9) diff --git a/Cargo.toml b/Cargo.toml index f408a849..631463a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ authors = [ "Thom Chiovoloni ", ] name = "mentat" -version = "0.8.1" +version = "0.9.0" build = "build/version.rs" [features] diff --git a/automation/docker/Dockerfile b/automation/docker/Dockerfile new file mode 100644 index 00000000..94e01bb2 --- /dev/null +++ b/automation/docker/Dockerfile @@ -0,0 +1,95 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +FROM mozillamobile/android-components:1.4 + +MAINTAINER Nick Alexander "nalexander@mozilla.com" + +#---------------------------------------------------------------------------------------------------------------------- +#-- Configuration ----------------------------------------------------------------------------------------------------- +#---------------------------------------------------------------------------------------------------------------------- + +ENV ANDROID_NDK_VERSION "r17b" +ENV PROJECT_REPOSITORY "https://github.com/mozilla/mentat.git" + +#---------------------------------------------------------------------------------------------------------------------- +#-- System ------------------------------------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------------- + +RUN apt-get update -qq + +#---------------------------------------------------------------------------------------------------------------------- +#-- Android NDK (Android SDK comes from base `android-components` image) ---------------------------------------------- +#---------------------------------------------------------------------------------------------------------------------- + +RUN mkdir -p /build +WORKDIR /build + +# ENV ANDROID_HOME /build/android-sdk +# ENV ANDROID_SDK_HOME /build/android-sdk +ENV ANDROID_NDK_HOME /build/android-ndk +# ENV PATH ${PATH}:${ANDROID_NDK_HOME}/tools:${ANDROID_SDK_HOME}/tools/bin:${ANDROID_SDK_HOME}/platform-tools:/opt/tools:${ANDROID_SDK_HOME}/build-tools/${ANDROID_BUILD_TOOLS} + +RUN curl -L https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux-x86_64.zip > ndk.zip \ + && unzip ndk.zip -d /build \ + && rm ndk.zip \ + && mv /build/android-ndk-${ANDROID_NDK_VERSION} ${ANDROID_NDK_HOME} + +#---------------------------------------------------------------------------------------------------------------------- +#-- Rust (cribbed from https://github.com/rust-lang-nursery/docker-rust/blob/ced83778ec6fea7f63091a484946f95eac0ee611/1.27.1/stretch/Dockerfile) +#-- Rust after the Android NDK since Rust rolls forward more frequently. +#---------------------------------------------------------------------------------------------------------------------- + +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH \ + RUST_VERSION=1.27.1 + +RUN set -eux; \ + rustArch='x86_64-unknown-linux-gnu'; rustupSha256='4d382e77fd6760282912d2d9beec5e260ec919efd3cb9bdb64fe1207e84b9d91'; \ + url="https://static.rust-lang.org/rustup/archive/1.12.0/${rustArch}/rustup-init"; \ + wget "$url"; \ + echo "${rustupSha256} *rustup-init" | sha256sum -c -; \ + chmod +x rustup-init; \ + ./rustup-init -y --no-modify-path --default-toolchain $RUST_VERSION; \ + rm rustup-init; \ + chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \ + rustup --version; \ + cargo --version; \ + rustc --version; \ + rustup target add i686-linux-android; \ + rustup target add arm-linux-androideabi; \ + rustup target add aarch64-linux-android + +#---------------------------------------------------------------------------------------------------------------------- +#-- Project ----------------------------------------------------------------------------------------------------------- +#---------------------------------------------------------------------------------------------------------------------- + +RUN git clone $PROJECT_REPOSITORY + +WORKDIR /build/mentat + +# Temporary. +RUN git fetch origin build-android-sdk && git checkout origin/build-android-sdk && git show-ref HEAD + +# Populate dependencies. +RUN ./sdks/android/Mentat/gradlew --no-daemon -p sdks/android/Mentat tasks + +# Cache toolchains. +RUN ./sdks/android/Mentat/gradlew --no-daemon -p sdks/android/Mentat generateToolchains + +# Build Rust. +RUN ./sdks/android/Mentat/gradlew --no-daemon -p sdks/android/Mentat cargoBuild + +# Actually build. In the future, we might also test and lint (to cache additional dependencies). +RUN ./sdks/android/Mentat/gradlew --no-daemon -p sdks/android/Mentat assemble + +# Drop built Rust artifacts. +RUN cargo clean + +#---------------------------------------------------------------------------------------------------------------------- +# -- Cleanup ---------------------------------------------------------------------------------------------------------- +#---------------------------------------------------------------------------------------------------------------------- + +RUN apt-get clean diff --git a/automation/taskcluster/decision_task_pull_request.py b/automation/taskcluster/decision_task_pull_request.py new file mode 100644 index 00000000..69e4e98c --- /dev/null +++ b/automation/taskcluster/decision_task_pull_request.py @@ -0,0 +1,122 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import datetime +import json +import os +import taskcluster +import re +import subprocess +import sys + + +""" +Decision task for pull requests +""" + +TASK_ID = os.environ.get('TASK_ID') +REPO_URL = os.environ.get('GITHUB_HEAD_REPO_URL') +BRANCH = os.environ.get('GITHUB_HEAD_BRANCH') +COMMIT = os.environ.get('GITHUB_HEAD_SHA') + +def fetch_module_names(): + process = subprocess.Popen(["./gradlew", "--no-daemon", "printModules"], stdout=subprocess.PIPE, + cwd=os.path.join(os.getcwd(), "sdks", "android", "Mentat")) + (output, err) = process.communicate() + exit_code = process.wait() + + if exit_code is not 0: + print "Gradle command returned error:", exit_code + + return re.findall('module: (.*)', output, re.M) + + +def schedule_task(queue, taskId, task): + print "TASK", taskId + print json.dumps(task, indent=4, separators=(',', ': ')) + + result = queue.createTask(taskId, task) + print "RESULT", taskId + print json.dumps(result, indent=4, separators=(',', ': ')) + + +def create_task(name, description, command): + created = datetime.datetime.now() + expires = taskcluster.fromNow('1 year') + deadline = taskcluster.fromNow('1 day') + + return { + "workerType": 'github-worker', + "taskGroupId": TASK_ID, + "expires": taskcluster.stringDate(expires), + "retries": 5, + "created": taskcluster.stringDate(created), + "tags": {}, + "priority": "lowest", + "schedulerId": "taskcluster-github", + "deadline": taskcluster.stringDate(deadline), + "dependencies": [ TASK_ID ], + "routes": [], + "scopes": [], + "requires": "all-completed", + "payload": { + "features": {}, + "maxRunTime": 7200, + "image": "mozillamobile/mentat:1.1", + "command": [ + "/bin/bash", + "--login", + "-cx", + "export TERM=dumb && git fetch %s %s && git config advice.detachedHead false && git checkout %s && cd sdks/android/Mentat && ./gradlew --no-daemon clean %s" % (REPO_URL, BRANCH, COMMIT, command) + ], + "artifacts": {}, + "deadline": taskcluster.stringDate(deadline) + }, + "provisionerId": "aws-provisioner-v1", + "metadata": { + "name": name, + "description": description, + "owner": "nalexander@mozilla.com", + "source": "https://github.com/mozilla/mentat" + } + } + + +def create_module_task(module): + return create_task( + name='Mentat Android SDK - Module ' + module, + description='Building and testing module ' + module, + command=" ".join(map(lambda x: module + ":" + x, ['assemble', 'test', 'lint']))) + + +# def create_detekt_task(): +# return create_task( +# name='Android Components - detekt', +# description='Running detekt over all modules', +# command='detektCheck') + + +# def create_ktlint_task(): +# return create_task( +# name='Android Components - ktlint', +# description='Running ktlint over all modules', +# command='ktlint') + + +if __name__ == "__main__": + queue = taskcluster.Queue({ 'baseUrl': 'http://taskcluster/queue/v1' }) + + modules = fetch_module_names() + + if len(modules) == 0: + print "Could not get module names from gradle" + sys.exit(2) + + for module in modules: + task = create_module_task(module) + task_id = taskcluster.slugId() + schedule_task(queue, task_id, task) + + # schedule_task(queue, taskcluster.slugId(), create_detekt_task()) + # schedule_task(queue, taskcluster.slugId(), create_ktlint_task()) diff --git a/automation/taskcluster/release/fetch-bintray-api-key.py b/automation/taskcluster/release/fetch-bintray-api-key.py new file mode 100644 index 00000000..53bec81b --- /dev/null +++ b/automation/taskcluster/release/fetch-bintray-api-key.py @@ -0,0 +1,28 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import os +import taskcluster + +SECRET_NAME = 'project/mentat/publish' +TASKCLUSTER_BASE_URL = 'http://taskcluster/secrets/v1' + +def fetch_publish_secrets(secret_name): + """Fetch and return secrets from taskcluster's secret service""" + secrets = taskcluster.Secrets({'baseUrl': TASKCLUSTER_BASE_URL}) + return secrets.get(secret_name) + +def main(): + """Fetch the bintray user and api key from taskcluster's secret service + and save it to local.properties in the project root directory. + """ + data = fetch_publish_secrets(SECRET_NAME) + + properties_file_path = os.path.join(os.path.dirname(__file__), '../../../sdks/android/Mentat/local.properties') + with open(properties_file_path, 'w') as properties_file: + properties_file.write("bintray.user=%s\n" % data['secret']['bintray_user']) + properties_file.write("bintray.apikey=%s\n" % data['secret']['bintray_apikey']) + +if __name__ == "__main__": + main() diff --git a/sdks/android/Mentat/build.gradle b/sdks/android/Mentat/build.gradle index ee3ebc49..96b6c7cc 100644 --- a/sdks/android/Mentat/build.gradle +++ b/sdks/android/Mentat/build.gradle @@ -4,27 +4,32 @@ buildscript { ext.kotlin_version = '1.2.41' ext.library = [ - version: '0.3.1' + version: '0.9.0' ] ext.build = [ - compileSdkVersion: 27, - targetSdkVersion: 27, - minSdkVersion: 19 + compileSdkVersion: 27, + targetSdkVersion: 27, + minSdkVersion: 21, // So that we can publish for aarch64. ] repositories { jcenter() google() + maven { + url "https://plugins.gradle.org/m2/" + } } + dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:3.1.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // Publish. classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' + classpath 'gradle.plugin.org.mozilla.rust-android-gradle:plugin:0.0.4' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -32,11 +37,19 @@ buildscript { allprojects { repositories { - jcenter() google() + jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } + +task printModules { + doLast { + subprojects.each { p -> + println "module: " + p.path + } + } +} diff --git a/sdks/android/Mentat/gradle.properties b/sdks/android/Mentat/gradle.properties index 89e15d97..30c2374f 100644 --- a/sdks/android/Mentat/gradle.properties +++ b/sdks/android/Mentat/gradle.properties @@ -10,6 +10,7 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m +org.gradle.configureondemand=false # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit @@ -17,10 +18,11 @@ org.gradle.jvmargs=-Xmx1536m # org.gradle.parallel=true libGroupId=org.mozilla.mentat -libRepositoryName=Mentat +libRepositoryName=mentat libProjectName=mentat libProjectDescription=A persistent, relational store inspired by Datomic and DataScript. libUrl=https://github.com/mozilla/mentat libVcsUrl=https://github.com/mozilla/mentat.git -libLicense=MPL-2.0 +libLicense 'Apache-2.0' +libLicenseUrl 'http://www.apache.org/licenses/LICENSE-2.0.txt' diff --git a/sdks/android/Mentat/gradle/wrapper/gradle-wrapper.properties b/sdks/android/Mentat/gradle/wrapper/gradle-wrapper.properties index 73bb13d5..610ad4c5 100644 --- a/sdks/android/Mentat/gradle/wrapper/gradle-wrapper.properties +++ b/sdks/android/Mentat/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.5-all.zip diff --git a/sdks/android/Mentat/library/build.gradle b/sdks/android/Mentat/library/build.gradle index 24632eef..d4e85ce0 100644 --- a/sdks/android/Mentat/library/build.gradle +++ b/sdks/android/Mentat/library/build.gradle @@ -1,4 +1,6 @@ apply plugin: 'com.android.library' +apply plugin: 'org.mozilla.rust-android-gradle.rust-android' + apply plugin: 'kotlin-android' apply plugin: 'com.jfrog.bintray' // Simply applying this plugin gets bintray to publish a pom file. @@ -33,6 +35,18 @@ android { } } +cargo { + module = '../../../../ffi' + targetDirectory = '../../../../target' + targetInclude = 'libmentat_ffi.so' + + targets = [ + 'x86', + 'arm', + 'arm64', + ] +} + dependencies { androidTestImplementation 'com.android.support:support-annotations:27.1.1' androidTestImplementation 'com.android.support.test:runner:1.0.2' @@ -41,54 +55,27 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'net.java.dev.jna:jna:4.5.1' } + repositories { mavenCentral() } -// Publishing to jcenter/bintray. -def libGroupId = properties.libGroupId -def libRepoName = properties.libRepositoryName -def libProjectName = properties.libProjectName -def libProjectDescription = properties.libProjectDescription -def libUrl = properties.libUrl -def libVcsUrl = properties.libVcsUrl -def libLicense = properties.libLicense - -Properties localProperties = null -if (project.rootProject.file('local.properties').canRead()) { - localProperties = new Properties() - localProperties.load(project.rootProject.file('local.properties').newDataInputStream()) -} - -version = rootProject.ext.library['version'] - -task sourcesJar(type: Jar) { - from android.sourceSets.main.java.srcDirs - classifier = 'sources' -} - -artifacts { - archives sourcesJar -} - - -group = libGroupId -archivesBaseName = libProjectName - -bintray { - user = localProperties != null ? localProperties.getProperty("bintray.user") : "" - key = localProperties != null ? localProperties.getProperty("bintray.apikey") : "" - - configurations = ['archives'] - pkg { - repo = libRepoName - name = libProjectName - userOrg = "grisha" // Temporary org name until package is on jcenter. Issue #725. - desc = libProjectDescription - websiteUrl = libUrl - vcsUrl = libVcsUrl - licenses = [libLicense] - publish = true - publicDownloadNumbers = true +afterEvaluate { + // The `cargoBuild` tasks isn't available until after evaluation. + android.libraryVariants.all { variant -> + def productFlavor = "" + variant.productFlavors.each { + productFlavor += "${it.name.capitalize()}" + } + def buildType = "${variant.buildType.name.capitalize()}" + tasks["generate${productFlavor}${buildType}Assets"].dependsOn(tasks["cargoBuild"]) } } + +archivesBaseName = 'mentat' + +apply from: '../publish.gradle' +ext.configurePublish( + 'org.mozilla.mentat', + 'mentat', + 'A persistent, embedded knowledge base.') diff --git a/sdks/android/Mentat/library/src/main/jniLibs/arm64/libmentat_ffi.so b/sdks/android/Mentat/library/src/main/jniLibs/arm64/libmentat_ffi.so deleted file mode 120000 index 192961bd..00000000 --- a/sdks/android/Mentat/library/src/main/jniLibs/arm64/libmentat_ffi.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../../../target/aarch64-linux-android/release/libmentat_ffi.so \ No newline at end of file diff --git a/sdks/android/Mentat/library/src/main/jniLibs/armeabi/libmentat_ffi.so b/sdks/android/Mentat/library/src/main/jniLibs/armeabi/libmentat_ffi.so deleted file mode 120000 index f248755f..00000000 --- a/sdks/android/Mentat/library/src/main/jniLibs/armeabi/libmentat_ffi.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../../../target/armv7-linux-androideabi/release/libmentat_ffi.so \ No newline at end of file diff --git a/sdks/android/Mentat/library/src/main/jniLibs/x86/libmentat_ffi.so b/sdks/android/Mentat/library/src/main/jniLibs/x86/libmentat_ffi.so deleted file mode 120000 index 2d4f93c2..00000000 --- a/sdks/android/Mentat/library/src/main/jniLibs/x86/libmentat_ffi.so +++ /dev/null @@ -1 +0,0 @@ -../../../../../../../../target/i686-linux-android/release/libmentat_ffi.so \ No newline at end of file diff --git a/sdks/android/Mentat/publish.gradle b/sdks/android/Mentat/publish.gradle new file mode 100644 index 00000000..43504583 --- /dev/null +++ b/sdks/android/Mentat/publish.gradle @@ -0,0 +1,99 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +def libRepoName = properties.libRepositoryName +def libUrl = properties.libUrl +def libVcsUrl = properties.libVcsUrl +def libLicense = properties.libLicense +def libLicenseUrl = properties.libLicenseUrl + +ext.configurePublish = { groupIdArg, artifactIdArg, descriptionArg -> + apply plugin: 'com.github.dcendents.android-maven' + + group = groupIdArg + + install { + repositories.mavenInstaller { + pom { + project { + packaging 'aar' + groupId groupIdArg + artifactId artifactIdArg + + name libRepoName + description descriptionArg + url libUrl + + licenses { + license { + name libLicense + url libLicenseUrl + } + } + + developers { + developer { + id 'nalexander' + name 'Nick Alexander' + email 'nalexander@mozilla.com' + } + } + + scm { + connection libVcsUrl + developerConnection libVcsUrl + url libUrl + } + } + } + } + } + + apply plugin: 'com.jfrog.bintray' + + version = rootProject.ext.library['version'] + + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } + + task javadoc(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + } + + task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir + } + + artifacts { + //archives javadocJar + archives sourcesJar + } + + Properties localProperties = null; + if (project.rootProject.file('local.properties').canRead()) { + localProperties = new Properties() + localProperties.load(project.rootProject.file('local.properties').newDataInputStream()) + } + + bintray { + user = localProperties != null ? localProperties.getProperty("bintray.user") : "" + key = localProperties != null ? localProperties.getProperty("bintray.apikey") : "" + + configurations = ['archives'] + pkg { + repo = libRepoName + name = artifactIdArg + desc = descriptionArg + websiteUrl = libUrl + vcsUrl = libVcsUrl + licenses = [libLicense] + publish = true + publicDownloadNumbers = true + } + } +} From 7e31ca15bcaeb8d5ff4316b6d92d5ee5a68421f4 Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Thu, 26 Jul 2018 13:01:53 -0700 Subject: [PATCH 4/7] [sdks] Make `store_open{_encrypted}` return useful errors. Because this was formerly a constructor, the pattern needed to change to a factory function, but that's better than what we had. --- ffi/src/lib.rs | 10 ++- .../mozilla/mentat/FFIIntegrationTest.java | 64 +++++++++---------- .../src/main/java/org/mozilla/mentat/JNA.java | 2 +- .../main/java/org/mozilla/mentat/Mentat.java | 43 +++++++------ .../org/mozilla/samples/basic/MainActivity.kt | 5 +- sdks/swift/Mentat/Mentat/Mentat.swift | 4 +- sdks/swift/Mentat/Mentat/store.h | 2 +- 7 files changed, 68 insertions(+), 62 deletions(-) diff --git a/ffi/src/lib.rs b/ffi/src/lib.rs index 98c45d8d..5d2c532e 100644 --- a/ffi/src/lib.rs +++ b/ffi/src/lib.rs @@ -208,21 +208,19 @@ impl<'a, 'c> InProgressTransactResult<'a, 'c> { /// A destructor `store_destroy` is provided for releasing the memory for this /// pointer type. #[no_mangle] -pub extern "C" fn store_open(uri: *const c_char) -> *mut Store { +pub unsafe extern "C" fn store_open(uri: *const c_char, error: *mut ExternError) -> *mut Store { assert_not_null!(uri); let uri = c_char_to_string(uri); - let store = Store::open(&uri).expect("expected a store"); - Box::into_raw(Box::new(store)) + translate_result(Store::open(&uri), error) } /// Variant of store_open that opens an encrypted database. #[cfg(feature = "sqlcipher")] #[no_mangle] -pub extern "C" fn store_open_encrypted(uri: *const c_char, key: *const c_char) -> *mut Store { +pub unsafe extern "C" fn store_open_encrypted(uri: *const c_char, key: *const c_char, error: *mut ExternError) -> *mut Store { let uri = c_char_to_string(uri); let key = c_char_to_string(key); - let store = Store::open_with_key(&uri, &key).expect("expected a store"); - Box::into_raw(Box::new(store)) + translate_result(Store::open_with_key(&uri, &key), error) } // TODO: open empty diff --git a/sdks/android/Mentat/library/src/androidTest/java/org/mozilla/mentat/FFIIntegrationTest.java b/sdks/android/Mentat/library/src/androidTest/java/org/mozilla/mentat/FFIIntegrationTest.java index ac199eb6..0b5be28d 100644 --- a/sdks/android/Mentat/library/src/androidTest/java/org/mozilla/mentat/FFIIntegrationTest.java +++ b/sdks/android/Mentat/library/src/androidTest/java/org/mozilla/mentat/FFIIntegrationTest.java @@ -71,7 +71,7 @@ public class FFIIntegrationTest { @Test public void openInMemoryStoreSucceeds() throws Exception { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); assertNotNull(mentat); } @@ -79,7 +79,7 @@ public class FFIIntegrationTest { public void openStoreInLocationSucceeds() throws Exception { Context context = InstrumentationRegistry.getTargetContext(); String path = context.getDatabasePath("test.db").getAbsolutePath(); - Mentat mentat = new Mentat(path); + Mentat mentat = Mentat.open(path); assertNotNull(mentat); } @@ -114,7 +114,7 @@ public class FFIIntegrationTest { public Mentat openAndInitializeCitiesStore() { if (this.mentat == null) { - this.mentat = new Mentat(); + this.mentat = Mentat.open(); this.transactCitiesSchema(mentat); this.transactSeattleData(mentat); } @@ -177,7 +177,7 @@ public class FFIIntegrationTest { @Test public void transactingVocabularySucceeds() { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport schemaReport = this.transactCitiesSchema(mentat); assertNotNull(schemaReport); assertTrue(schemaReport.getTxId() > 0); @@ -185,7 +185,7 @@ public class FFIIntegrationTest { @Test public void transactingEntitiesSucceeds() { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); this.transactCitiesSchema(mentat); TxReport dataReport = this.transactSeattleData(mentat); assertNotNull(dataReport); @@ -363,7 +363,7 @@ public class FFIIntegrationTest { @Test public void bindingLongValueSucceeds() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?e . :in ?long :where [?e :foo/long ?long]]"; @@ -384,7 +384,7 @@ public class FFIIntegrationTest { @Test public void bindingRefValueSucceeds() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; long stringEntid = mentat.entIdForAttribute(":foo/string"); final Long bEntid = report.getEntidForTempId("b"); @@ -406,7 +406,7 @@ public class FFIIntegrationTest { @Test public void bindingRefKwValueSucceeds() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; String refKeyword = ":foo/string"; final Long bEntid = report.getEntidForTempId("b"); @@ -428,7 +428,7 @@ public class FFIIntegrationTest { @Test public void bindingKwValueSucceeds() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?e . :in ?kw :where [?e :foo/keyword ?kw]]"; @@ -449,7 +449,7 @@ public class FFIIntegrationTest { @Test public void bindingDateValueSucceeds() throws InterruptedException, ParseException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); @@ -493,7 +493,7 @@ public class FFIIntegrationTest { @Test public void bindingUuidValueSucceeds() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?e . :in ?uuid :where [?e :foo/uuid ?uuid]]"; @@ -515,7 +515,7 @@ public class FFIIntegrationTest { @Test public void bindingBooleanValueSucceeds() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?e . :in ?bool :where [?e :foo/boolean ?bool]]"; @@ -537,7 +537,7 @@ public class FFIIntegrationTest { @Test public void bindingDoubleValueSucceeds() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?e . :in ?double :where [?e :foo/double ?double]]"; @@ -558,7 +558,7 @@ public class FFIIntegrationTest { @Test public void typedValueConvertsToLong() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?v . :in ?e :where [?e :foo/long ?v]]"; @@ -580,7 +580,7 @@ public class FFIIntegrationTest { @Test public void typedValueConvertsToRef() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?e . :where [?e :foo/long 25]]"; @@ -602,7 +602,7 @@ public class FFIIntegrationTest { @Test public void typedValueConvertsToKeyword() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?v . :in ?e :where [?e :foo/keyword ?v]]"; @@ -624,7 +624,7 @@ public class FFIIntegrationTest { @Test public void typedValueConvertsToBoolean() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?v . :in ?e :where [?e :foo/boolean ?v]]"; @@ -646,7 +646,7 @@ public class FFIIntegrationTest { @Test public void typedValueConvertsToDouble() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?v . :in ?e :where [?e :foo/double ?v]]"; @@ -668,7 +668,7 @@ public class FFIIntegrationTest { @Test public void typedValueConvertsToDate() throws InterruptedException, ParseException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?v . :in ?e :where [?e :foo/instant ?v]]"; @@ -693,7 +693,7 @@ public class FFIIntegrationTest { @Test public void typedValueConvertsToString() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?v . :in ?e :where [?e :foo/string ?v]]"; @@ -715,7 +715,7 @@ public class FFIIntegrationTest { @Test public void typedValueConvertsToUUID() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); String query = "[:find ?v . :in ?e :where [?e :foo/uuid ?v]]"; @@ -738,7 +738,7 @@ public class FFIIntegrationTest { @Test public void valueForAttributeOfEntitySucceeds() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; final Long aEntid = report.getEntidForTempId("a"); TypedValue value = mentat.valueForAttributeOfEntity(":foo/long", aEntid); @@ -748,7 +748,7 @@ public class FFIIntegrationTest { @Test public void entidForAttributeSucceeds() { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); this.populateWithTypesSchema(mentat); long entid = mentat.entIdForAttribute(":foo/long"); assertEquals(65540, entid); @@ -756,7 +756,7 @@ public class FFIIntegrationTest { @Test public void testInProgressTransact() { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; assertNotNull(report); @@ -764,7 +764,7 @@ public class FFIIntegrationTest { @Test public void testInProgressRollback() { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); TxReport report = this.populateWithTypesSchema(mentat).dataReport; assertNotNull(report); long aEntid = report.getEntidForTempId("a"); @@ -782,7 +782,7 @@ public class FFIIntegrationTest { @Test public void testInProgressEntityBuilder() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); DBSetupResult reports = this.populateWithTypesSchema(mentat); long bEntid = reports.dataReport.getEntidForTempId("b"); final long longEntid = reports.schemaReport.getEntidForTempId("l"); @@ -862,7 +862,7 @@ public class FFIIntegrationTest { @Test public void testEntityBuilderForEntid() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); DBSetupResult reports = this.populateWithTypesSchema(mentat); long bEntid = reports.dataReport.getEntidForTempId("b"); final long longEntid = reports.schemaReport.getEntidForTempId("l"); @@ -942,7 +942,7 @@ public class FFIIntegrationTest { @Test public void testEntityBuilderForTempid() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); DBSetupResult reports = this.populateWithTypesSchema(mentat); final long longEntid = reports.schemaReport.getEntidForTempId("l"); @@ -998,7 +998,7 @@ public class FFIIntegrationTest { @Test public void testInProgressBuilderTransact() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); DBSetupResult reports = this.populateWithTypesSchema(mentat); long aEntid = reports.dataReport.getEntidForTempId("a"); long bEntid = reports.dataReport.getEntidForTempId("b"); @@ -1063,7 +1063,7 @@ public class FFIIntegrationTest { @Test public void testEntityBuilderTransact() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); DBSetupResult reports = this.populateWithTypesSchema(mentat); long aEntid = reports.dataReport.getEntidForTempId("a"); long bEntid = reports.dataReport.getEntidForTempId("b"); @@ -1129,7 +1129,7 @@ public class FFIIntegrationTest { @Test public void testEntityBuilderRetract() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); DBSetupResult reports = this.populateWithTypesSchema(mentat); long bEntid = reports.dataReport.getEntidForTempId("b"); final long longEntid = reports.schemaReport.getEntidForTempId("l"); @@ -1199,7 +1199,7 @@ public class FFIIntegrationTest { @Test public void testInProgressBuilderRetract() throws InterruptedException { - Mentat mentat = new Mentat(); + Mentat mentat = Mentat.open(); DBSetupResult reports = this.populateWithTypesSchema(mentat); long bEntid = reports.dataReport.getEntidForTempId("b"); final long longEntid = reports.schemaReport.getEntidForTempId("l"); diff --git a/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/JNA.java b/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/JNA.java index b8ba5d42..44ac12c2 100644 --- a/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/JNA.java +++ b/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/JNA.java @@ -42,7 +42,7 @@ public interface JNA extends Library { class InProgressBuilder extends PointerType {} class EntityBuilder extends PointerType {} - Store store_open(String dbPath); + Store store_open(String dbPath, RustError.ByReference err); void destroy(Pointer obj); void uuid_destroy(Pointer obj); diff --git a/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/Mentat.java b/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/Mentat.java index 94f4f285..f51ecc7f 100644 --- a/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/Mentat.java +++ b/sdks/android/Mentat/library/src/main/java/org/mozilla/mentat/Mentat.java @@ -21,32 +21,39 @@ import com.sun.jna.Pointer; * The raw pointer it holds is a pointer to a Store. */ public class Mentat extends RustObject { - static { System.loadLibrary("mentat_ffi"); } - /** - * Open a connection to a Store in a given location.
- * If the store does not already exist, one will be created. - * @param dbPath The URI as a String of the store to open. - */ - public Mentat(String dbPath) { - this(JNA.INSTANCE.store_open(dbPath)); - } - - /** - * Open a connection to an in-memory Store. - */ - public Mentat() { - this(JNA.INSTANCE.store_open("")); - } - /** * Create a new Mentat with the provided pointer to a Mentat Store * @param rawPointer A pointer to a Mentat Store. */ - public Mentat(JNA.Store rawPointer) { super(rawPointer); } + private Mentat(JNA.Store rawPointer) { super(rawPointer); } + + /** + * Open a connection to an in-memory Mentat Store. + */ + public static Mentat open() { + return open(""); + } + + /** + * Open a connection to a Store in a given location. + *
+ * If the store does not already exist, one will be created. + * @param dbPath The URI as a String of the store to open. + */ + public static Mentat open(String dbPath) { + RustError.ByReference err = new RustError.ByReference(); + JNA.Store store = JNA.INSTANCE.store_open(dbPath, err); + if (!err.isSuccess()) { + err.logAndConsumeError("Mentat"); + throw new RuntimeException("Failed to open store: " + dbPath); + } + + return new Mentat(store); + } /** * Add an attribute to the cache. The {@link CacheDirection} determines how that attribute can be diff --git a/sdks/android/Mentat/samples/basic/src/main/java/org/mozilla/samples/basic/MainActivity.kt b/sdks/android/Mentat/samples/basic/src/main/java/org/mozilla/samples/basic/MainActivity.kt index 81c75a42..e7627b4d 100644 --- a/sdks/android/Mentat/samples/basic/src/main/java/org/mozilla/samples/basic/MainActivity.kt +++ b/sdks/android/Mentat/samples/basic/src/main/java/org/mozilla/samples/basic/MainActivity.kt @@ -21,8 +21,9 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - Mentat(this.getDatabasePath("test.db").absolutePath).use { + this.getDatabasePath("test.db").absoluteFile.parentFile.mkdirs(); + + Mentat.open(this.getDatabasePath("test.db").absolutePath).use { } } } - diff --git a/sdks/swift/Mentat/Mentat/Mentat.swift b/sdks/swift/Mentat/Mentat/Mentat.swift index 2bd569e6..712bcf4b 100644 --- a/sdks/swift/Mentat/Mentat/Mentat.swift +++ b/sdks/swift/Mentat/Mentat/Mentat.swift @@ -58,8 +58,8 @@ open class Mentat: RustObject { - Parameter storeURI: The URI as a String of the store to open. If no store URI is provided, an in-memory store will be opened. */ - public convenience init(storeURI: String = "") { - self.init(raw: store_open(storeURI)) + public class func open(storeURI: String = "") throws -> Mentat { + return Mentat(raw: try RustError.unwrap({err in store_open(storeURI, err) })) } /** diff --git a/sdks/swift/Mentat/Mentat/store.h b/sdks/swift/Mentat/Mentat/store.h index 4163358b..729875f6 100644 --- a/sdks/swift/Mentat/Mentat/store.h +++ b/sdks/swift/Mentat/Mentat/store.h @@ -102,7 +102,7 @@ typedef NS_ENUM(NSInteger, ValueType) { }; // Store -struct Store*_Nonnull store_open(const char*_Nonnull uri); +struct Store*_Nonnull store_open(const char*_Nonnull uri, struct RustError* _Nonnull error); // Destructors. void destroy(void* _Nullable obj); From 76d7df554872aa84341f90a2b478e12c2f5afa06 Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Thu, 26 Jul 2018 13:05:31 -0700 Subject: [PATCH 5/7] [sdks/android] Package JNA using upstream dependency. --- sdks/android/Mentat/library/build.gradle | 2 +- .../src/main/jniLibs/arm64/libjnidispatch.so | Bin 101976 -> 0 bytes .../src/main/jniLibs/armeabi/libjnidispatch.so | Bin 101596 -> 0 bytes .../src/main/jniLibs/x86/libjnidispatch.so | Bin 99392 -> 0 bytes 4 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 sdks/android/Mentat/library/src/main/jniLibs/arm64/libjnidispatch.so delete mode 100644 sdks/android/Mentat/library/src/main/jniLibs/armeabi/libjnidispatch.so delete mode 100644 sdks/android/Mentat/library/src/main/jniLibs/x86/libjnidispatch.so diff --git a/sdks/android/Mentat/library/build.gradle b/sdks/android/Mentat/library/build.gradle index d4e85ce0..4a0efd50 100644 --- a/sdks/android/Mentat/library/build.gradle +++ b/sdks/android/Mentat/library/build.gradle @@ -53,7 +53,7 @@ dependencies { androidTestImplementation 'com.android.support.test:rules:1.0.2' testImplementation 'junit:junit:4.12' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'net.java.dev.jna:jna:4.5.1' + implementation 'net.java.dev.jna:jna:4.5.2@aar' } repositories { diff --git a/sdks/android/Mentat/library/src/main/jniLibs/arm64/libjnidispatch.so b/sdks/android/Mentat/library/src/main/jniLibs/arm64/libjnidispatch.so deleted file mode 100644 index d2b1a8f281b2432a363f80a208248d885eb4b80e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101976 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 diff --git a/sdks/android/Mentat/library/src/main/jniLibs/armeabi/libjnidispatch.so b/sdks/android/Mentat/library/src/main/jniLibs/armeabi/libjnidispatch.so deleted file mode 100644 index bc16713517105d7d0fcb8baf7dd72fa4fda96a03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101596 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%0D8?6t?09JHl}muE9|l20iNQQiqzzn@X|P zrrkHH9OThZ(_Oq#b9H{}CkDCKu?ih>M@=;G=LXODN&Oa6I=7ItXH#d~(=jy8&HBJA zKTi1vD4(UntEt9&IrEmzsV#=4&@L2bE{)VcD|j+ARN_f!YRaG${S;qJ#h zj(Z089PUTB9PXD{Q%0z7_|4G$xW{qN48Lh~yS_AGxW{qNq)nKUrL8lOG4w?h?biBr z5;8KGeH452y|Q)Wj+N#;Cy{39iP9w4UpP@3_ul;7W75RDHxVboYo~hOMqY3};nYN? z7=^#N_ks?`zB_x3QFMLjMo3xYD`yx;BOZ-#PTL_)>tVHX7@m?Zomca!(RrC$&^4Ji zk$vD1)OpeGj*NWB%I8oQWi^tAF*NddJ8!Tj@aiygr1TN+V{ES}{0P4)$v9vR(>{!T zr>BB3!M)2u73KS|;!h_`Y0fA7d2mm04_oUW2Rn-J(fgUo%bsO{yKk?Kpg+mpD4TH7 zsVPL#ALnZ6Jx*2n-r_9sA4P{tF|IH`PIu53HGh2x9HZ=2hfmd8tkBa*7rsDR=R(Sd z2F^lcNUhbUROd&T%Y5B7d}>W0#M-Oom3mjC&2FhTrEr{Nt=N;He zBunD+29SehEmY)CNqLr&Rq9Nqv2)j>O_3r8OZm0wxgU(lL#Kjkt1nfAQHYtK>A((m+b zDj)aS6n@u$ew*gVcS-+o>QVbAkJEnPDqTtSAE18Ly3>zE19ayC=OYd8ttQR8z{ku1 z$f%=Rzj0V&b{S(jL|x3MtS9fyhZ)~d7o8nhfK9y^f!C^7>r7x@=`_|tr-PHfZj6z? z5_kzVj2QL-!KVPL%n1%>ib4aN?@s0YxLNzKm5^p8{^HMt`nC?noUz#p-Der(kIP#>Mh^FG-Gl0@eh`HGUceu zJ`ew3`N8k8?HwL2x845^rVru}{I)c?_bu%j56?d&e1V~1-&^P(#535Z!Sum;gW}~oTQGgFUBUK_&FjmDApL{i&j`=dAY#>Vo?%fDaR!;1`3{Cp z4)sm(!o$x<<~W8|W54J3_NtLPlD`?bBYxV*9bfs-=TbE_BX?X0d^^6vH%=Y7V=?~X zGe+)Mf}c8b!rwoAM z;fL_kz(_`C79;qSrUgTEL55Pk;#u2s~9zZ-u){)_l8 z;73=F+;IRufqxKx9sY~>cj3Q;zZ+luvHb=cK5wmscYVaBulcAApN+3{^YB&9E`0G( zrp<;Q#8kz)$6~EWEs|8>6-G;A0(S@({ zFWzUA44A^>#gB>HGq|=*)o!L+7LTqI2()w*0;L zs&6;G!nZ%=h5wnY_b|Tjoc8Ay&pG%?KO0}+JH7Ch|84ta+0&K|?f9b43tzPTvj0mK zuNgnG`D^fnXZzpVa_;)EEq}&A8=n3r+s?iCqQmX~V#9a+)Z)41-)#6(_`8XJ6W`#I zwdEvoww|N-3V*|ctMcR<9!|}W|CMlRj|V#i;4g$zZ^|EjI@Nf{rn}AfUrZgu|4R2) zQ?D0oxco1DaDHn0%NBmh_+L!LU$Jl+-x-XiG9FxW*uwMicb)dt)EoH7>=cKS3_eHk z|Kfw;)T*Nv@7I56!x9yfzw|8TAYg3Ec+v%>k*4@zA?KZb}_H6EMbvHJ3w6wQ&S5mI>Ucb55 z?cCsQYTeY?y`@xCdwXYdQ*Wy)uif3y-L$FIOAp+>zNz_Uw{!i+Tbp|+uE$;9+S=jX z)YQGc>84hjZ@Q)F z;`XMFn=S^y>o;6$(7UR;yR#b_+2;BQ%yU8{-{MNRXR<{&6s!UtZ>W=Q#=FXcs z+Wxq;#l3Fn_3rx38#aJY@0KoF>p182T;VS5xTUGRt;HZo9kj0Fme!8mwoVp!WgM5% z7j)mWc@wc$-PYXNWzz)90L{(Kz3PLO)(vePZA#(R`u#E6-8fP1KHe_mK@IJ-VH2Sy*}_tBTX}mLD!bBDfiRK z@sZzMUMHG{K%+l~?>akFnBlADlk0QkR-RRzo$jWljxBDJN5dYsc2m=B?s@HMeUR3x zJ9;*Eb#->bVb^!HcAHwu1gGsDjn#{8TgQe@!+0eup=c9h#jC|VuO(Qv*N-cEAyB!@ zg_bS+JU#BF%{{#^z1z|T12KHM83hcvCbz4*Z4=$fw}y!LrK!8SX$$x-Dv_geeQ#4+ zhd1C%7Y1^fn$+G=yr~f~n)$8};@8=cu2{FHwRdwD`C8gwjo#*sbDJFpR&w9}emCL1 z>s{_SbhlxxhVI%6EEij*(fGBzagOT!*m*5~ zj+;%RG|t~LzSeJHg!p~u%K$Y8QE3=Ud=sQmeJ6;tc6)U3`nb8hsiy~GZ<-4!=R(T4 zelq7uG2{ohhjz^cYeaWD^!$9C9d>lWSypt9TTWLimGXDZ*fJF1(oh8N(#0n#Wla4y zwRf&Z?02^!4O=^WLGzZzSpKs-*V)tR)Y6nu?dV|~wKc=)y&F4Q7%e?rBx5$|+{A1& zwn=_zj-v!VRJ*L)dyACkeSv`M%@p*$3zh|Y!sfiTsSA1fzT@FjuBO(MJjb==U2q}{ zgE&DW&2|@GYufmGA~&|rM$;>RpDq1l5$rH>VU?N1g1B1xT@WCk4H5qwr{BuOoq#aC zoqn&u*Q5Gml^3(fOjeAOV-l*|(_Y6OA1}YU6JRwKm#a(Mbv$eWL>kk@LHeB(o`HTm zM%{j=&T(xgpOE`T%bn7EHy3#(Stnb))3mv_a|KH9Tlm{(#-3Cy=VCYMk7vz>`MDu{yTn9Glu>%C?D5B*9BmQyVognGPL`ryucqlophzrAlTm z+_FYf_t^4}!)tTPSw_v5i##n-c#op#TgxgX4dUbnuJGrm*$d3_=X#@e_nd5*rR;M@ zXFn#crNk$Xb1;j>oR9V~#=|kW;-jMniJ$%0W5na=KsDouM!%dgdStp9jY%qeNkg2kRZLglr@DznHI5068u zQJv~jutfFIJc}MvmXWsP4|R8L?&8SBm@zV%wqwyb`G!z#a7^9c(f0)7(N8uiucf5b zy555CTgUXM#XHmY5g z__H@`XlrQp#rtTS-lCHnD~r?CaZBgTOft3CTw_*8qsp+6rAhaAYl+dAjOO+7oOboq zOVtyzJ)gDUTjJbJZ9P4bJgiMqLUotxLUx6buhGmy{5DBsoXolU)7l5)8VJ3HH3n>y^`v-YEK&9Y9a^GYhG zTcnP1JP!7w1NA5uJhHJ#%lX#sx74$yvkk3li}dR^Y`_4bc9+}Wl}OlI(~n9=`5wKFQDnJ1+X1S>&^DNM zRJ|V62osfp$$TtJ?GGY$jPwKr+Eb#oM~p>=7}R#GDgybs?Fx0SU0$fnF?noS^+zef z>$_u=T&9Pig6-pAx=}bA4)E|@X=PNY%SZQIxm-&WFVkXWDzk~rqc)V&n>rkENf3>< z&^pj*%0D)}!VK5XmHO1VsjIUCL#_ma8FG$SHU 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 diff --git a/sdks/android/Mentat/library/src/main/jniLibs/x86/libjnidispatch.so b/sdks/android/Mentat/library/src/main/jniLibs/x86/libjnidispatch.so deleted file mode 100644 index a87d08655a4115f3c1ec6914eed2bc72f00189bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99392 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 Date: Thu, 26 Jul 2018 13:06:03 -0700 Subject: [PATCH 6/7] [sdks/android] Don't strip Mentat library. Help folks debugging by including symbols in our native libraries. Yes, this makes the resulting AAR very large. The Android ecosystem seems to be in flux around who is in charge of stripping native binaries, but for now let's provide symbols and see how consumers react. --- sdks/android/Mentat/library/build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sdks/android/Mentat/library/build.gradle b/sdks/android/Mentat/library/build.gradle index 4a0efd50..c0f3d9c7 100644 --- a/sdks/android/Mentat/library/build.gradle +++ b/sdks/android/Mentat/library/build.gradle @@ -33,6 +33,13 @@ android { lintOptions { abortOnError false } + + // Help folks debugging by including symbols in our native libraries. Yes, this makes the + // resulting AAR very large. The Android ecosystem seems to be in flux around who is in charge + // of stripping native binaries, but for now let's provide symbols and see how consumers react. + packagingOptions { + doNotStrip "**/*.so" + } } cargo { From faef4e9ee8f3c6dd32a0dbfeb25ceffd6e86b2b6 Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Thu, 26 Jul 2018 13:09:18 -0700 Subject: [PATCH 7/7] Bump to version 0.10.0. --- CHANGELOG.md | 12 +++++++++++- Cargo.toml | 2 +- sdks/android/Mentat/build.gradle | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 255ddcd3..5357bf88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# 0.10 (2018-07-26) + +* sdks/android compiled against: + * Kotlin standard library 1.2.41 + +* **API changes**: + * `store_open{_encrypted}` now accepts an error parameter; corresponding constructors changed to be factory functions. + +* [Commits](https://github.com/mozilla/mentat/compare/v0.9.0...v0.10.0) + # 0.9 (2018-07-25) * sdks/android compiled against: @@ -8,4 +18,4 @@ * **sdks/android**: First version published to nalexander's personal bintray repository. * Various bugfixes and refactorings (see commits below for details) -* [Commits](https://github.com/mozilla-mobile/android-components/compare/v0.8.1...v0.9) +* [Commits](https://github.com/mozilla/mentat/compare/v0.8.1...v0.9.0) diff --git a/Cargo.toml b/Cargo.toml index 631463a2..165a083e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ authors = [ "Thom Chiovoloni ", ] name = "mentat" -version = "0.9.0" +version = "0.10.0" build = "build/version.rs" [features] diff --git a/sdks/android/Mentat/build.gradle b/sdks/android/Mentat/build.gradle index 96b6c7cc..22784c91 100644 --- a/sdks/android/Mentat/build.gradle +++ b/sdks/android/Mentat/build.gradle @@ -4,7 +4,7 @@ buildscript { ext.kotlin_version = '1.2.41' ext.library = [ - version: '0.9.0' + version: '0.10.0' ] ext.build = [