mirror of
https://github.com/mozilla-services/syncstorage-rs.git
synced 2026-05-08 13:46:24 +02:00
Merge branch 'master' into release/0.1
This commit is contained in:
commit
0540b4f8ef
136
Cargo.lock
generated
136
Cargo.lock
generated
@ -239,11 +239,6 @@ dependencies = [
|
||||
"memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "antidote"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "arc-swap"
|
||||
version = "0.3.11"
|
||||
@ -323,15 +318,6 @@ dependencies = [
|
||||
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"safemem 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.10.1"
|
||||
@ -925,20 +911,6 @@ name = "glob"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "google-spanner1"
|
||||
version = "1.0.10+20190613"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"yup-oauth2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "googleapis-raw"
|
||||
version = "0.0.1"
|
||||
@ -1074,24 +1046,6 @@ dependencies = [
|
||||
"quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "0.10.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "0.12.35"
|
||||
@ -1121,16 +1075,6 @@ dependencies = [
|
||||
"want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-native-tls"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-tls"
|
||||
version = "0.3.2"
|
||||
@ -1203,14 +1147,6 @@ dependencies = [
|
||||
"winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "0.4.4"
|
||||
@ -1293,14 +1229,6 @@ dependencies = [
|
||||
"scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.8"
|
||||
@ -1353,14 +1281,6 @@ dependencies = [
|
||||
"syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mime"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mime"
|
||||
version = "0.3.14"
|
||||
@ -2007,11 +1927,6 @@ name = "ryu"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "safemem"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "same-file"
|
||||
version = "1.0.5"
|
||||
@ -2401,7 +2316,6 @@ dependencies = [
|
||||
"env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"google-spanner1 1.0.10+20190613 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"googleapis-raw 0.0.1",
|
||||
"grpcio 0.5.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hawk 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2433,7 +2347,6 @@ dependencies = [
|
||||
"uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"validator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"validator_derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"yup-oauth2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2688,11 +2601,6 @@ dependencies = [
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "traitobject"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "trust-dns-proto"
|
||||
version = "0.7.4"
|
||||
@ -2748,11 +2656,6 @@ dependencies = [
|
||||
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typeable"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.11.2"
|
||||
@ -2766,14 +2669,6 @@ dependencies = [
|
||||
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicase"
|
||||
version = "1.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicase"
|
||||
version = "2.5.1"
|
||||
@ -3012,24 +2907,6 @@ dependencies = [
|
||||
"linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "yup-oauth2"
|
||||
version = "1.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"chrono 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper-native-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl 0.10.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[metadata]
|
||||
"checksum actix-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9f2c11af4b06dc935d8e1b1491dad56bfb32febc49096a91e773f8535c176453"
|
||||
"checksum actix-connect 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9fade9bd4bb46bacde89f1e726c7a3dd230536092712f5d94d77ca57c087fca0"
|
||||
@ -3046,7 +2923,6 @@ dependencies = [
|
||||
"checksum actix-web-codegen 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe9e3cdec1e645b675f354766e0688c5705021c85ab3cf739be1c8999b91c76"
|
||||
"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c"
|
||||
"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d"
|
||||
"checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5"
|
||||
"checksum arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "bc4662175ead9cd84451d5c35070517777949a2ed84551764129cedb88384841"
|
||||
"checksum arc-swap 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "854ede29f7a0ce90519fb2439d030320c6201119b87dab0ee96044603e1130b9"
|
||||
"checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee"
|
||||
@ -3057,7 +2933,6 @@ dependencies = [
|
||||
"checksum backtrace 0.3.37 (registry+https://github.com/rust-lang/crates.io-index)" = "5180c5a20655b14a819b652fd2378fa5f1697b6c9ddad3e695c2f9cedf6df4e2"
|
||||
"checksum backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "82a830b4ef2d1124a711c71d263c5abdc710ef8e907bd508c88be475cebc422b"
|
||||
"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
|
||||
"checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643"
|
||||
"checksum bindgen 0.51.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18270cdd7065ec045a6bb4bdcd5144d14a78b3aedb3bc5111e688773ac8b9ad0"
|
||||
"checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd"
|
||||
"checksum blake2b_simd 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "5850aeee1552f495dd0250014cf64b82b7c8879a89d83b33bbdace2cc4f63182"
|
||||
@ -3125,7 +3000,6 @@ dependencies = [
|
||||
"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec"
|
||||
"checksum getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571"
|
||||
"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
|
||||
"checksum google-spanner1 1.0.10+20190613 (registry+https://github.com/rust-lang/crates.io-index)" = "ff0777f496d043e9c61b10f233b4dc5e2ced688662d07f293b37a86618666b9e"
|
||||
"checksum grpcio 0.5.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ba77e7b81b58a12e2dff1271c20a1f8cd74916de09355a5777470d911e8de41c"
|
||||
"checksum grpcio-sys 0.5.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0d2c6e956b8080cd5610a834bee17ab729d4cca2ce05db6987dfbeab18faf98d"
|
||||
"checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462"
|
||||
@ -3139,9 +3013,7 @@ dependencies = [
|
||||
"checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9"
|
||||
"checksum httpdate 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47"
|
||||
"checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
|
||||
"checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273"
|
||||
"checksum hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)" = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6"
|
||||
"checksum hyper-native-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d375598f442742b0e66208ee12501391f1c7ac0bafb90b4fe53018f81f06068"
|
||||
"checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f"
|
||||
"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
|
||||
"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
|
||||
@ -3150,7 +3022,6 @@ dependencies = [
|
||||
"checksum indexmap 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a61202fbe46c4a951e9404a720a0180bcf3212c750d735cb5c4ba4dc551299f3"
|
||||
"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
|
||||
"checksum ipconfig 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa79fa216fbe60834a9c0737d7fcd30425b32d1c58854663e24d4c4b328ed83f"
|
||||
"checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358"
|
||||
"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
|
||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
||||
"checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a"
|
||||
@ -3163,7 +3034,6 @@ dependencies = [
|
||||
"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c"
|
||||
"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff"
|
||||
"checksum lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8912e782533a93a167888781b836336a6ca5da6175c05944c86cf28c31104dc"
|
||||
"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
|
||||
"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
|
||||
"checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c"
|
||||
"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
|
||||
@ -3171,7 +3041,6 @@ dependencies = [
|
||||
"checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f"
|
||||
"checksum migrations_internals 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8089920229070f914b9ce9b07ef60e175b2b9bc2d35c3edd8bf4433604e863b9"
|
||||
"checksum migrations_macros 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1664412abf7db2b8a6d58be42a38b099780cc542b5b350383b805d88932833fe"
|
||||
"checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0"
|
||||
"checksum mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "dd1d63acd1b78403cc0c325605908475dd9b9a3acbf65ed8bcab97e27014afcf"
|
||||
"checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599"
|
||||
"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202"
|
||||
@ -3243,7 +3112,6 @@ dependencies = [
|
||||
"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
|
||||
"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
|
||||
"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997"
|
||||
"checksum safemem 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b08423011dae9a5ca23f07cf57dac3857f5c885d352b76f6d95f4aea9434d0"
|
||||
"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
|
||||
"checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021"
|
||||
"checksum scheduled-thread-pool 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bd07742e081ff6c077f5f6b283f12f32b9e7cc765b316160d66289b74546fbb3"
|
||||
@ -3309,15 +3177,12 @@ dependencies = [
|
||||
"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e"
|
||||
"checksum tokio-udp 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f02298505547f73e60f568359ef0d016d5acd6e830ab9bc7c4a5b3403440121b"
|
||||
"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f"
|
||||
"checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079"
|
||||
"checksum trust-dns-proto 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5559ebdf6c2368ddd11e20b11d6bbaf9e46deb803acd7815e93f5a7b4a6d2901"
|
||||
"checksum trust-dns-resolver 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6c9992e58dba365798803c0b91018ff6c8d3fc77e06977c4539af2a6bfe0a039"
|
||||
"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382"
|
||||
"checksum try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b"
|
||||
"checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887"
|
||||
"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9"
|
||||
"checksum uname 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b72f89f0ca32e4db1c04e2a72f5345d59796d4866a1ee0609084569f73683dc8"
|
||||
"checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33"
|
||||
"checksum unicase 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2e2e6bd1e59e56598518beb94fd6db628ded570326f0a98c679a304bd9f00150"
|
||||
"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
|
||||
"checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426"
|
||||
@ -3349,4 +3214,3 @@ dependencies = [
|
||||
"checksum winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7daf138b6b14196e3830a588acf1e86966c694d3e8fb026fb105b8b5dca07e6e"
|
||||
"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
|
||||
"checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d"
|
||||
"checksum yup-oauth2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = "add0ccdddbb13a69ba8f7c4738bd6af551425889cc4633b6f8cb3034bb359b07"
|
||||
|
||||
19
Cargo.toml
19
Cargo.toml
@ -30,18 +30,15 @@ docopt = "1.1.0"
|
||||
env_logger = "0.6"
|
||||
failure = "0.1.5"
|
||||
futures = "0.1.28"
|
||||
googleapis-raw = { version = "0", path = "../mozilla-rust-sdk/googleapis-raw", optional = true }
|
||||
grpcio = { version = "0.5.0-alpha.1", optional = true }
|
||||
googleapis-raw = { version = "0", path = "../mozilla-rust-sdk/googleapis-raw" }
|
||||
grpcio = { version = "0.5.0-alpha.1" }
|
||||
lazy_static = "1.4.0"
|
||||
# XXX: switch to this line google-apis-rs support
|
||||
#hawk = { version = "3.0.0", default_features = false, features = ["use_openssl"] }
|
||||
hawk = "3.0.0"
|
||||
hkdf = "0.8.0"
|
||||
hmac = "0.7"
|
||||
log = "0.4"
|
||||
mime = "0.3"
|
||||
mozsvc-common = "0.1"
|
||||
# num = "0.2.0"
|
||||
num_cpus = "1.10"
|
||||
protobuf = "2.7.0"
|
||||
rand = "0.7"
|
||||
@ -65,17 +62,5 @@ uuid = { version = "0.7.4", features = ["serde", "v4"] }
|
||||
validator = "0.9"
|
||||
validator_derive = "0.9"
|
||||
|
||||
google-spanner1 = "1.0.10"
|
||||
#google-spanner1 = { version = "*", path = "../google-apis-rs/gen/spanner1" }
|
||||
# This project intentionally uses an old version of Hyper. See
|
||||
# https://github.com/Byron/google-apis-rs/issues/173 for more
|
||||
# information.
|
||||
# XXX: switch these on for google-apis-rs support
|
||||
#hyper = "^0.10"
|
||||
#hyper-rustls = "^0.6"
|
||||
yup-oauth2 = "^1.0"
|
||||
|
||||
[features]
|
||||
default = ["google_grpc"]
|
||||
db_test = []
|
||||
google_grpc = ["googleapis-raw", "grpcio"]
|
||||
|
||||
136
db-tests/Cargo.lock
generated
136
db-tests/Cargo.lock
generated
@ -239,11 +239,6 @@ dependencies = [
|
||||
"memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "antidote"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "arc-swap"
|
||||
version = "0.3.11"
|
||||
@ -323,15 +318,6 @@ dependencies = [
|
||||
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"safemem 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.10.1"
|
||||
@ -1015,20 +1001,6 @@ name = "glob"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "google-spanner1"
|
||||
version = "1.0.10+20190613"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"yup-oauth2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "googleapis-raw"
|
||||
version = "0.0.1"
|
||||
@ -1164,24 +1136,6 @@ dependencies = [
|
||||
"quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "0.10.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "0.12.35"
|
||||
@ -1211,16 +1165,6 @@ dependencies = [
|
||||
"want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-native-tls"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-tls"
|
||||
version = "0.3.2"
|
||||
@ -1293,14 +1237,6 @@ dependencies = [
|
||||
"winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "0.4.4"
|
||||
@ -1383,14 +1319,6 @@ dependencies = [
|
||||
"scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.8"
|
||||
@ -1443,14 +1371,6 @@ dependencies = [
|
||||
"syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mime"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mime"
|
||||
version = "0.3.14"
|
||||
@ -2102,11 +2022,6 @@ name = "ryu"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "safemem"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "same-file"
|
||||
version = "1.0.5"
|
||||
@ -2496,7 +2411,6 @@ dependencies = [
|
||||
"env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"google-spanner1 1.0.10+20190613 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"googleapis-raw 0.0.1",
|
||||
"grpcio 0.5.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hawk 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2528,7 +2442,6 @@ dependencies = [
|
||||
"uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"validator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"validator_derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"yup-oauth2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2783,11 +2696,6 @@ dependencies = [
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "traitobject"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "trust-dns-proto"
|
||||
version = "0.7.4"
|
||||
@ -2843,11 +2751,6 @@ dependencies = [
|
||||
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typeable"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.11.2"
|
||||
@ -2861,14 +2764,6 @@ dependencies = [
|
||||
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicase"
|
||||
version = "1.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicase"
|
||||
version = "2.5.1"
|
||||
@ -3107,24 +3002,6 @@ dependencies = [
|
||||
"linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "yup-oauth2"
|
||||
version = "1.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"chrono 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hyper-native-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl 0.10.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[metadata]
|
||||
"checksum actix-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9f2c11af4b06dc935d8e1b1491dad56bfb32febc49096a91e773f8535c176453"
|
||||
"checksum actix-connect 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9fade9bd4bb46bacde89f1e726c7a3dd230536092712f5d94d77ca57c087fca0"
|
||||
@ -3141,7 +3018,6 @@ dependencies = [
|
||||
"checksum actix-web-codegen 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe9e3cdec1e645b675f354766e0688c5705021c85ab3cf739be1c8999b91c76"
|
||||
"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2"
|
||||
"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d"
|
||||
"checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5"
|
||||
"checksum arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "bc4662175ead9cd84451d5c35070517777949a2ed84551764129cedb88384841"
|
||||
"checksum arc-swap 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "854ede29f7a0ce90519fb2439d030320c6201119b87dab0ee96044603e1130b9"
|
||||
"checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee"
|
||||
@ -3152,7 +3028,6 @@ dependencies = [
|
||||
"checksum backtrace 0.3.37 (registry+https://github.com/rust-lang/crates.io-index)" = "5180c5a20655b14a819b652fd2378fa5f1697b6c9ddad3e695c2f9cedf6df4e2"
|
||||
"checksum backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "82a830b4ef2d1124a711c71d263c5abdc710ef8e907bd508c88be475cebc422b"
|
||||
"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
|
||||
"checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643"
|
||||
"checksum bindgen 0.51.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18270cdd7065ec045a6bb4bdcd5144d14a78b3aedb3bc5111e688773ac8b9ad0"
|
||||
"checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd"
|
||||
"checksum blake2b_simd 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "5850aeee1552f495dd0250014cf64b82b7c8879a89d83b33bbdace2cc4f63182"
|
||||
@ -3227,7 +3102,6 @@ dependencies = [
|
||||
"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec"
|
||||
"checksum getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571"
|
||||
"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
|
||||
"checksum google-spanner1 1.0.10+20190613 (registry+https://github.com/rust-lang/crates.io-index)" = "ff0777f496d043e9c61b10f233b4dc5e2ced688662d07f293b37a86618666b9e"
|
||||
"checksum grpcio 0.5.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ba77e7b81b58a12e2dff1271c20a1f8cd74916de09355a5777470d911e8de41c"
|
||||
"checksum grpcio-sys 0.5.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0d2c6e956b8080cd5610a834bee17ab729d4cca2ce05db6987dfbeab18faf98d"
|
||||
"checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462"
|
||||
@ -3241,9 +3115,7 @@ dependencies = [
|
||||
"checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9"
|
||||
"checksum httpdate 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47"
|
||||
"checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
|
||||
"checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273"
|
||||
"checksum hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)" = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6"
|
||||
"checksum hyper-native-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d375598f442742b0e66208ee12501391f1c7ac0bafb90b4fe53018f81f06068"
|
||||
"checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f"
|
||||
"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
|
||||
"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
|
||||
@ -3252,7 +3124,6 @@ dependencies = [
|
||||
"checksum indexmap 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a61202fbe46c4a951e9404a720a0180bcf3212c750d735cb5c4ba4dc551299f3"
|
||||
"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
|
||||
"checksum ipconfig 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa79fa216fbe60834a9c0737d7fcd30425b32d1c58854663e24d4c4b328ed83f"
|
||||
"checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358"
|
||||
"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
|
||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
||||
"checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a"
|
||||
@ -3265,7 +3136,6 @@ dependencies = [
|
||||
"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c"
|
||||
"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff"
|
||||
"checksum lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8912e782533a93a167888781b836336a6ca5da6175c05944c86cf28c31104dc"
|
||||
"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
|
||||
"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
|
||||
"checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c"
|
||||
"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
|
||||
@ -3273,7 +3143,6 @@ dependencies = [
|
||||
"checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f"
|
||||
"checksum migrations_internals 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8089920229070f914b9ce9b07ef60e175b2b9bc2d35c3edd8bf4433604e863b9"
|
||||
"checksum migrations_macros 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1664412abf7db2b8a6d58be42a38b099780cc542b5b350383b805d88932833fe"
|
||||
"checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0"
|
||||
"checksum mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "dd1d63acd1b78403cc0c325605908475dd9b9a3acbf65ed8bcab97e27014afcf"
|
||||
"checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599"
|
||||
"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202"
|
||||
@ -3346,7 +3215,6 @@ dependencies = [
|
||||
"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
|
||||
"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
|
||||
"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997"
|
||||
"checksum safemem 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b08423011dae9a5ca23f07cf57dac3857f5c885d352b76f6d95f4aea9434d0"
|
||||
"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
|
||||
"checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021"
|
||||
"checksum scheduled-thread-pool 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bd07742e081ff6c077f5f6b283f12f32b9e7cc765b316160d66289b74546fbb3"
|
||||
@ -3412,15 +3280,12 @@ dependencies = [
|
||||
"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e"
|
||||
"checksum tokio-udp 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f02298505547f73e60f568359ef0d016d5acd6e830ab9bc7c4a5b3403440121b"
|
||||
"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f"
|
||||
"checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079"
|
||||
"checksum trust-dns-proto 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5559ebdf6c2368ddd11e20b11d6bbaf9e46deb803acd7815e93f5a7b4a6d2901"
|
||||
"checksum trust-dns-resolver 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6c9992e58dba365798803c0b91018ff6c8d3fc77e06977c4539af2a6bfe0a039"
|
||||
"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382"
|
||||
"checksum try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b"
|
||||
"checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887"
|
||||
"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9"
|
||||
"checksum uname 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b72f89f0ca32e4db1c04e2a72f5345d59796d4866a1ee0609084569f73683dc8"
|
||||
"checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33"
|
||||
"checksum unicase 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2e2e6bd1e59e56598518beb94fd6db628ded570326f0a98c679a304bd9f00150"
|
||||
"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
|
||||
"checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426"
|
||||
@ -3452,4 +3317,3 @@ dependencies = [
|
||||
"checksum winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7daf138b6b14196e3830a588acf1e86966c694d3e8fb026fb105b8b5dca07e6e"
|
||||
"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
|
||||
"checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d"
|
||||
"checksum yup-oauth2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = "add0ccdddbb13a69ba8f7c4738bd6af551425889cc4633b6f8cb3034bb359b07"
|
||||
|
||||
@ -12,5 +12,3 @@ lazy_static = "1.3.0"
|
||||
rand = "0.6.5"
|
||||
syncstorage = { version = "0.1.0", path = "../", features = ["db_test"] }
|
||||
|
||||
[features]
|
||||
google_grpc = ["syncstorage/google_grpc"]
|
||||
|
||||
@ -25,7 +25,8 @@ CREATE TABLE bso (
|
||||
ON bso(fxa_uid, fxa_kid, collection_id, modified DESC, expiry),
|
||||
INTERLEAVE IN user_collections;
|
||||
|
||||
CREATE INDEX BsoExpiry ON bso(expiry);
|
||||
CREATE INDEX BsoExpiry
|
||||
ON bso(expiry);
|
||||
|
||||
|
||||
CREATE TABLE collections (
|
||||
@ -33,6 +34,9 @@ CREATE TABLE collections (
|
||||
name STRING(MAX) NOT NULL,
|
||||
) PRIMARY KEY(id);
|
||||
|
||||
CREATE UNIQUE INDEX CollectionName
|
||||
ON collections(name);
|
||||
|
||||
|
||||
CREATE TABLE batches (
|
||||
fxa_uid STRING(MAX) NOT NULL,
|
||||
|
||||
@ -90,8 +90,6 @@ impl From<Context<DbErrorKind>> for DbError {
|
||||
#[derive(Debug)]
|
||||
pub enum ConnectionError {
|
||||
Diesel(diesel::result::ConnectionError),
|
||||
Spanner(String),
|
||||
#[cfg(feature = "google_grpc")]
|
||||
SpannerGrpc(grpcio::Error),
|
||||
}
|
||||
|
||||
@ -99,8 +97,6 @@ impl fmt::Display for ConnectionError {
|
||||
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
ConnectionError::Diesel(e) => fmt::Display::fmt(e, formatter),
|
||||
ConnectionError::Spanner(msg) => fmt::Display::fmt(msg, formatter),
|
||||
#[cfg(feature = "google_grpc")]
|
||||
ConnectionError::SpannerGrpc(e) => fmt::Display::fmt(e, formatter),
|
||||
}
|
||||
}
|
||||
@ -112,14 +108,7 @@ from_error!(diesel::result::Error, DbError, DbErrorKind::Query);
|
||||
from_error!(diesel::result::ConnectionError, DbError, |inner| {
|
||||
DbErrorKind::Connection(ConnectionError::Diesel(inner))
|
||||
});
|
||||
from_error!(
|
||||
google_spanner1::Error,
|
||||
DbError,
|
||||
|inner: google_spanner1::Error| DbErrorKind::Connection(ConnectionError::Spanner(
|
||||
inner.to_string()
|
||||
))
|
||||
);
|
||||
#[cfg(feature = "google_grpc")]
|
||||
|
||||
from_error!(grpcio::Error, DbError, |inner: grpcio::Error| {
|
||||
// Convert ABORTED (typically due to a transaction abort) into 503s
|
||||
match inner {
|
||||
|
||||
@ -1,18 +1,14 @@
|
||||
use diesel::r2d2::ManageConnection;
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
use google_spanner1::{CreateSessionRequest, Session, Spanner};
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
use hyper::{net::HttpsConnector, Client};
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
use hyper_rustls::TlsClient;
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
use yup_oauth2::{service_account_key_from_file, GetToken, ServiceAccountAccess};
|
||||
|
||||
use crate::{
|
||||
db::error::{DbError, DbErrorKind},
|
||||
settings::Settings,
|
||||
};
|
||||
|
||||
use googleapis_raw::spanner::v1::spanner_grpc::SpannerClient;
|
||||
|
||||
use googleapis_raw::spanner::v1::spanner::{CreateSessionRequest, ExecuteSqlRequest, Session};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct SpannerConnectionManager {
|
||||
database_name: String,
|
||||
@ -30,28 +26,17 @@ impl SpannerConnectionManager {
|
||||
}
|
||||
|
||||
pub struct SpannerSession {
|
||||
#[cfg(feature = "google_grpc")]
|
||||
pub client: googleapis_raw::spanner::v1::spanner_grpc::SpannerClient,
|
||||
#[cfg(feature = "google_grpc")]
|
||||
pub session: googleapis_raw::spanner::v1::spanner::Session,
|
||||
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
pub hub: Spanner<Client, ServiceAccountAccess<Client>>,
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
pub client: SpannerClient,
|
||||
pub session: Session,
|
||||
|
||||
pub(super) use_test_transactions: bool,
|
||||
}
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
impl ManageConnection for SpannerConnectionManager {
|
||||
type Connection = SpannerSession;
|
||||
type Error = grpcio::Error;
|
||||
|
||||
fn connect(&self) -> Result<Self::Connection, Self::Error> {
|
||||
use googleapis_raw::spanner::v1::{
|
||||
spanner::CreateSessionRequest, spanner_grpc::SpannerClient,
|
||||
};
|
||||
use grpcio::{CallOption, ChannelBuilder, ChannelCredentials, EnvBuilder, MetadataBuilder};
|
||||
use std::sync::Arc;
|
||||
|
||||
@ -87,7 +72,7 @@ impl ManageConnection for SpannerConnectionManager {
|
||||
}
|
||||
|
||||
fn is_valid(&self, conn: &mut Self::Connection) -> Result<(), Self::Error> {
|
||||
let mut req = googleapis_raw::spanner::v1::spanner::ExecuteSqlRequest::new();
|
||||
let mut req = ExecuteSqlRequest::new();
|
||||
req.set_sql("SELECT 1".to_owned());
|
||||
req.set_session(conn.session.get_name().to_owned());
|
||||
conn.client.execute_sql(&req)?;
|
||||
@ -98,48 +83,3 @@ impl ManageConnection for SpannerConnectionManager {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
impl ManageConnection for SpannerConnectionManager {
|
||||
type Connection = SpannerSession;
|
||||
type Error = google_spanner1::Error;
|
||||
|
||||
fn connect(&self) -> Result<Self::Connection, Self::Error> {
|
||||
let secret = service_account_key_from_file(&String::from("service-account.json")).unwrap();
|
||||
let client = Client::with_connector(HttpsConnector::new(TlsClient::new()));
|
||||
let mut access = ServiceAccountAccess::new(secret, client);
|
||||
let _token = access
|
||||
.token(&vec!["https://www.googleapis.com/auth/spanner.data"])
|
||||
.unwrap();
|
||||
// println!("{:?}", token);
|
||||
let client2 = Client::with_connector(HttpsConnector::new(TlsClient::new()));
|
||||
let hub = Spanner::new(client2, access);
|
||||
let req = CreateSessionRequest::default();
|
||||
let session = hub
|
||||
.projects()
|
||||
.instances_databases_sessions_create(req, &self.database_name)
|
||||
.doit()?
|
||||
.1;
|
||||
Ok(SpannerSession {
|
||||
hub,
|
||||
session,
|
||||
use_test_transactions: false,
|
||||
})
|
||||
}
|
||||
|
||||
fn is_valid(&self, conn: &mut Self::Connection) -> Result<(), Self::Error> {
|
||||
use google_spanner1::ExecuteSqlRequest;
|
||||
let mut request = ExecuteSqlRequest::default();
|
||||
request.sql = Some("SELECT 1".to_owned());
|
||||
let session = conn.session.name.as_ref().unwrap();
|
||||
conn.hub
|
||||
.projects()
|
||||
.instances_databases_sessions_execute_sql(request, session)
|
||||
.doit()?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn has_broken(&self, _conn: &mut Self::Connection) -> bool {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,27 +17,30 @@ use super::support::SpannerType;
|
||||
use crate::db::{
|
||||
error::{DbError, DbErrorKind},
|
||||
params, results,
|
||||
util::{to_rfc3339, SyncTimestamp},
|
||||
util::SyncTimestamp,
|
||||
Db, DbFuture, Sorting, FIRST_CUSTOM_COLLECTION_ID,
|
||||
};
|
||||
|
||||
use crate::web::extractors::{BsoQueryParams, HawkIdentifier};
|
||||
|
||||
#[cfg(not(any(test, feature = "db_test")))]
|
||||
use super::support::{bso_to_insert_row, bso_to_update_row};
|
||||
use super::{
|
||||
batch,
|
||||
support::{as_list_value, as_value, bso_from_row, ExecuteSqlRequestBuilder},
|
||||
};
|
||||
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
use google_spanner1::{
|
||||
BeginTransactionRequest, CommitRequest, ExecuteSqlRequest, ReadOnly, ReadWrite,
|
||||
RollbackRequest, TransactionOptions,
|
||||
use googleapis_raw::spanner::v1::transaction;
|
||||
use googleapis_raw::spanner::v1::transaction::{
|
||||
TransactionOptions, TransactionOptions_ReadOnly, TransactionOptions_ReadWrite,
|
||||
};
|
||||
use googleapis_raw::spanner::v1::{
|
||||
mutation::{Mutation, Mutation_Write},
|
||||
spanner::{BeginTransactionRequest, CommitRequest, ExecuteSqlRequest, RollbackRequest},
|
||||
};
|
||||
use protobuf::{well_known_types::ListValue, RepeatedField};
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
pub type TransactionSelector = googleapis_raw::spanner::v1::transaction::TransactionSelector;
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
pub type TransactionSelector = google_spanner1::TransactionSelector;
|
||||
pub type TransactionSelector = transaction::TransactionSelector;
|
||||
|
||||
#[derive(Debug, Eq, PartialEq)]
|
||||
pub enum CollectionLock {
|
||||
@ -49,7 +52,7 @@ pub(super) type Conn = PooledConnection<SpannerConnectionManager>;
|
||||
pub type Result<T> = std::result::Result<T, DbError>;
|
||||
|
||||
/// The ttl to use for rows that are never supposed to expire (in seconds)
|
||||
pub const DEFAULT_BSO_TTL: i64 = 2_100_000_000;
|
||||
pub const DEFAULT_BSO_TTL: u32 = 2_100_000_000;
|
||||
|
||||
pub const TOMBSTONE: i32 = 0;
|
||||
|
||||
@ -63,10 +66,10 @@ struct SpannerDbSession {
|
||||
coll_modified_cache: HashMap<(HawkIdentifier, i32), SyncTimestamp>,
|
||||
/// Currently locked collections
|
||||
coll_locks: HashMap<(HawkIdentifier, i32), CollectionLock>,
|
||||
#[cfg(feature = "google_grpc")]
|
||||
transaction: Option<googleapis_raw::spanner::v1::transaction::TransactionSelector>,
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
transaction: Option<TransactionSelector>,
|
||||
/// Behind Vec so commit can take() it (maybe commit() should consume self
|
||||
/// instead?)
|
||||
mutations: Option<Vec<Mutation>>,
|
||||
in_write_transaction: bool,
|
||||
execute_sql_count: u64,
|
||||
}
|
||||
@ -286,57 +289,26 @@ impl SpannerDb {
|
||||
self.session.borrow_mut().timestamp = Some(timestamp);
|
||||
}
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
pub(super) fn begin(&self, for_write: bool) -> Result<()> {
|
||||
let spanner = &self.conn;
|
||||
let mut options = googleapis_raw::spanner::v1::transaction::TransactionOptions::new();
|
||||
let mut options = TransactionOptions::new();
|
||||
if for_write {
|
||||
options.set_read_write(
|
||||
googleapis_raw::spanner::v1::transaction::TransactionOptions_ReadWrite::new(),
|
||||
);
|
||||
options.set_read_write(TransactionOptions_ReadWrite::new());
|
||||
self.session.borrow_mut().in_write_transaction = true;
|
||||
} else {
|
||||
options.set_read_only(
|
||||
googleapis_raw::spanner::v1::transaction::TransactionOptions_ReadOnly::new(),
|
||||
);
|
||||
options.set_read_only(TransactionOptions_ReadOnly::new());
|
||||
}
|
||||
let mut req = googleapis_raw::spanner::v1::spanner::BeginTransactionRequest::new();
|
||||
let mut req = BeginTransactionRequest::new();
|
||||
req.set_session(spanner.session.get_name().to_owned());
|
||||
req.set_options(options);
|
||||
let mut transaction = spanner.client.begin_transaction(&req)?;
|
||||
|
||||
let mut ts = googleapis_raw::spanner::v1::transaction::TransactionSelector::new();
|
||||
let mut ts = TransactionSelector::new();
|
||||
ts.set_id(transaction.take_id());
|
||||
self.session.borrow_mut().transaction = Some(ts);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
pub(super) fn begin(&self, for_write: bool) -> Result<()> {
|
||||
let spanner = &self.conn;
|
||||
let session = spanner.session.name.as_ref().unwrap();
|
||||
let mut options = TransactionOptions::default();
|
||||
if for_write {
|
||||
options.read_write = Some(ReadWrite::default());
|
||||
self.session.borrow_mut().in_write_transaction = true;
|
||||
} else {
|
||||
options.read_only = Some(ReadOnly::default());
|
||||
}
|
||||
let req = BeginTransactionRequest {
|
||||
options: Some(options),
|
||||
};
|
||||
let (_, transaction) = spanner
|
||||
.hub
|
||||
.projects()
|
||||
.instances_databases_sessions_begin_transaction(req, session)
|
||||
.doit()?;
|
||||
self.session.borrow_mut().transaction = Some(google_spanner1::TransactionSelector {
|
||||
id: transaction.id,
|
||||
..Default::default()
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Return the current transaction metadata (TransactionSelector) if one is active.
|
||||
fn get_transaction(&self) -> Result<Option<TransactionSelector>> {
|
||||
Ok(if self.session.borrow().transaction.is_some() {
|
||||
@ -347,12 +319,8 @@ impl SpannerDb {
|
||||
})
|
||||
}
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
fn sql_request(
|
||||
&self,
|
||||
sql: &str,
|
||||
) -> Result<googleapis_raw::spanner::v1::spanner::ExecuteSqlRequest> {
|
||||
let mut sqlr = googleapis_raw::spanner::v1::spanner::ExecuteSqlRequest::new();
|
||||
fn sql_request(&self, sql: &str) -> Result<ExecuteSqlRequest> {
|
||||
let mut sqlr = ExecuteSqlRequest::new();
|
||||
sqlr.set_sql(sql.to_owned());
|
||||
if let Some(transaction) = self.get_transaction()? {
|
||||
sqlr.set_transaction(transaction);
|
||||
@ -366,29 +334,62 @@ impl SpannerDb {
|
||||
Ok(sqlr)
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
fn sql_request(&self, sql: &str) -> Result<ExecuteSqlRequest> {
|
||||
let mut sqlr = ExecuteSqlRequest::default();
|
||||
sqlr.sql = Some(sql.to_owned());
|
||||
let transaction = self.get_transaction()?;
|
||||
if transaction.is_some() {
|
||||
sqlr.transaction = transaction;
|
||||
let mut session = self.session.borrow_mut();
|
||||
sqlr.seqno = Some(session.execute_sql_count.to_string());
|
||||
session.execute_sql_count += 1;
|
||||
}
|
||||
Ok(sqlr)
|
||||
pub(super) fn sql(&self, sql: &str) -> Result<ExecuteSqlRequestBuilder> {
|
||||
Ok(ExecuteSqlRequestBuilder::new(self.sql_request(sql)?))
|
||||
}
|
||||
|
||||
pub fn sql(&self, sql: &str) -> Result<ExecuteSqlRequestBuilder> {
|
||||
Ok(ExecuteSqlRequestBuilder::new(self.sql_request(sql)?))
|
||||
#[cfg(not(any(test, feature = "db_test")))]
|
||||
pub(super) fn insert(&self, table: &str, columns: &[&str], values: Vec<ListValue>) {
|
||||
let mut mutation = Mutation::new();
|
||||
mutation.set_insert(self.mutation_write(table, columns, values));
|
||||
self.session
|
||||
.borrow_mut()
|
||||
.mutations
|
||||
.get_or_insert_with(|| vec![])
|
||||
.push(mutation);
|
||||
}
|
||||
|
||||
#[cfg(not(any(test, feature = "db_test")))]
|
||||
pub(super) fn update(&self, table: &str, columns: &[&str], values: Vec<ListValue>) {
|
||||
let mut mutation = Mutation::new();
|
||||
mutation.set_update(self.mutation_write(table, columns, values));
|
||||
self.session
|
||||
.borrow_mut()
|
||||
.mutations
|
||||
.get_or_insert_with(|| vec![])
|
||||
.push(mutation);
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub(super) fn insert_or_update(&self, table: &str, columns: &[&str], values: Vec<ListValue>) {
|
||||
let mut mutation = Mutation::new();
|
||||
mutation.set_insert_or_update(self.mutation_write(table, columns, values));
|
||||
self.session
|
||||
.borrow_mut()
|
||||
.mutations
|
||||
.get_or_insert_with(|| vec![])
|
||||
.push(mutation);
|
||||
}
|
||||
|
||||
fn mutation_write(
|
||||
&self,
|
||||
table: &str,
|
||||
columns: &[&str],
|
||||
values: Vec<ListValue>,
|
||||
) -> Mutation_Write {
|
||||
let mut write = Mutation_Write::new();
|
||||
write.set_table(table.to_owned());
|
||||
write.set_columns(RepeatedField::from_vec(
|
||||
columns.iter().map(|&column| column.to_owned()).collect(),
|
||||
));
|
||||
write.set_values(RepeatedField::from_vec(values));
|
||||
write
|
||||
}
|
||||
|
||||
fn in_write_transaction(&self) -> bool {
|
||||
self.session.borrow().in_write_transaction
|
||||
}
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
pub fn commit_sync(&self) -> Result<()> {
|
||||
if !self.in_write_transaction() {
|
||||
// read-only
|
||||
@ -403,9 +404,12 @@ impl SpannerDb {
|
||||
}
|
||||
|
||||
if let Some(transaction) = self.get_transaction()? {
|
||||
let mut req = googleapis_raw::spanner::v1::spanner::CommitRequest::new();
|
||||
let mut req = CommitRequest::new();
|
||||
req.set_session(spanner.session.get_name().to_owned());
|
||||
req.set_transaction_id(transaction.get_id().to_vec());
|
||||
if let Some(mutations) = self.session.borrow_mut().mutations.take() {
|
||||
req.set_mutations(RepeatedField::from_vec(mutations));
|
||||
}
|
||||
spanner.client.commit(&req)?;
|
||||
Ok(())
|
||||
} else {
|
||||
@ -413,40 +417,6 @@ impl SpannerDb {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
pub fn commit_sync(&self) -> Result<()> {
|
||||
if !self.in_write_transaction() {
|
||||
// read-only
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let spanner = &self.conn;
|
||||
|
||||
if cfg!(any(test, feature = "db_test")) && spanner.use_test_transactions {
|
||||
// don't commit test transactions
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
if let Some(transaction) = self.get_transaction()? {
|
||||
let session = spanner.session.name.as_ref().unwrap();
|
||||
spanner
|
||||
.hub
|
||||
.projects()
|
||||
.instances_databases_sessions_commit(
|
||||
CommitRequest {
|
||||
transaction_id: transaction.id,
|
||||
..Default::default()
|
||||
},
|
||||
session,
|
||||
)
|
||||
.doit()?;
|
||||
Ok(())
|
||||
} else {
|
||||
Err(DbError::internal("No transaction to commit"))?
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
pub fn rollback_sync(&self) -> Result<()> {
|
||||
if !self.in_write_transaction() {
|
||||
// read-only
|
||||
@ -455,7 +425,7 @@ impl SpannerDb {
|
||||
|
||||
if let Some(transaction) = self.get_transaction()? {
|
||||
let spanner = &self.conn;
|
||||
let mut req = googleapis_raw::spanner::v1::spanner::RollbackRequest::new();
|
||||
let mut req = RollbackRequest::new();
|
||||
req.set_session(spanner.session.get_name().to_owned());
|
||||
req.set_transaction_id(transaction.get_id().to_vec());
|
||||
spanner.client.rollback(&req)?;
|
||||
@ -465,32 +435,6 @@ impl SpannerDb {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
pub fn rollback_sync(&self) -> Result<()> {
|
||||
if !self.in_write_transaction() {
|
||||
// read-only
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
if let Some(transaction) = self.get_transaction()? {
|
||||
let spanner = &self.conn;
|
||||
let session = spanner.session.name.as_ref().unwrap();
|
||||
spanner
|
||||
.hub
|
||||
.projects()
|
||||
.instances_databases_sessions_rollback(
|
||||
RollbackRequest {
|
||||
transaction_id: transaction.id,
|
||||
},
|
||||
session,
|
||||
)
|
||||
.doit()?;
|
||||
Ok(())
|
||||
} else {
|
||||
Err(DbError::internal("No transaction to rollback"))?
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_collection_timestamp_sync(
|
||||
&self,
|
||||
params: params::GetCollectionTimestamp,
|
||||
@ -1089,7 +1033,106 @@ impl SpannerDb {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(any(test, feature = "db_test")))]
|
||||
pub fn put_bso_sync(&self, params: params::PutBso) -> Result<results::PutBso> {
|
||||
let bsos = vec![params::PostCollectionBso {
|
||||
id: params.id,
|
||||
sortindex: params.sortindex,
|
||||
payload: params.payload,
|
||||
ttl: params.ttl,
|
||||
}];
|
||||
let result = self.post_bsos_sync(params::PostBsos {
|
||||
user_id: params.user_id,
|
||||
collection: params.collection,
|
||||
bsos,
|
||||
failed: HashMap::new(),
|
||||
})?;
|
||||
Ok(result.modified)
|
||||
}
|
||||
|
||||
#[cfg(not(any(test, feature = "db_test")))]
|
||||
pub fn post_bsos_sync(&self, params: params::PostBsos) -> Result<results::PostBsos> {
|
||||
let user_id = params.user_id;
|
||||
let collection_id = self.get_or_create_collection_id(¶ms.collection)?;
|
||||
// Ensure a parent record exists in user_collections before writing to
|
||||
// bso (INTERLEAVE IN PARENT user_collections)
|
||||
let timestamp = self.touch_collection(&user_id, collection_id)?;
|
||||
|
||||
let mut sqlparams = params! {
|
||||
"fxa_uid" => user_id.fxa_uid.clone(),
|
||||
"fxa_kid" => user_id.fxa_kid.clone(),
|
||||
"collection_id" => collection_id.to_string(),
|
||||
};
|
||||
sqlparams.insert(
|
||||
"ids".to_owned(),
|
||||
as_list_value(params.bsos.iter().map(|pbso| pbso.id.clone())),
|
||||
);
|
||||
let existing: Vec<_> = self
|
||||
.sql(
|
||||
"SELECT id
|
||||
FROM bso
|
||||
WHERE fxa_uid = @fxa_uid
|
||||
AND fxa_kid = @fxa_kid
|
||||
AND collection_id = @collection_id
|
||||
AND id IN UNNEST(@ids)",
|
||||
)?
|
||||
.params(sqlparams)
|
||||
.execute(&self.conn)?
|
||||
.map(|row| row[0].get_string_value().to_owned())
|
||||
.collect();
|
||||
|
||||
let mut inserts = vec![];
|
||||
let mut updates = HashMap::new();
|
||||
let mut success = vec![];
|
||||
for bso in params.bsos {
|
||||
success.push(bso.id.clone());
|
||||
if existing.contains(&bso.id) {
|
||||
let (columns, values) = bso_to_update_row(&user_id, collection_id, bso, timestamp)?;
|
||||
updates
|
||||
.entry(columns)
|
||||
.or_insert_with(|| vec![])
|
||||
.push(values);
|
||||
} else {
|
||||
let values = bso_to_insert_row(&user_id, collection_id, bso, timestamp)?;
|
||||
inserts.push(values);
|
||||
}
|
||||
}
|
||||
|
||||
if !inserts.is_empty() {
|
||||
dbg!(&inserts);
|
||||
self.insert(
|
||||
"bso",
|
||||
&[
|
||||
"fxa_uid",
|
||||
"fxa_kid",
|
||||
"collection_id",
|
||||
"id",
|
||||
"sortindex",
|
||||
"payload",
|
||||
"modified",
|
||||
"expiry",
|
||||
],
|
||||
inserts,
|
||||
);
|
||||
}
|
||||
for (columns, values) in updates {
|
||||
dbg!(&columns, &values);
|
||||
self.update("bso", &columns, values);
|
||||
}
|
||||
|
||||
let result = results::PostBsos {
|
||||
modified: timestamp,
|
||||
success,
|
||||
failed: params.failed,
|
||||
};
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
// NOTE: Currently this put_bso_sync impl. is only used during db_tests,
|
||||
// see above for the non-tests version
|
||||
#[cfg(any(test, feature = "db_test"))]
|
||||
pub fn put_bso_sync(&self, bso: params::PutBso) -> Result<results::PutBso> {
|
||||
use crate::db::util::to_rfc3339;
|
||||
let collection_id = self.get_or_create_collection_id(&bso.collection)?;
|
||||
let mut sqlparams = params! {
|
||||
"fxa_uid" => bso.user_id.fxa_uid.clone(),
|
||||
@ -1200,8 +1243,6 @@ impl SpannerDb {
|
||||
};
|
||||
|
||||
if use_sortindex {
|
||||
// special handling for google_grpc (null)
|
||||
#[cfg(feature = "google_grpc")]
|
||||
let sortindex = bso
|
||||
.sortindex
|
||||
.map(|sortindex| as_value(sortindex.to_string()))
|
||||
@ -1212,12 +1253,6 @@ impl SpannerDb {
|
||||
value
|
||||
});
|
||||
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
let sortindex = bso
|
||||
.sortindex
|
||||
.map(|sortindex| sortindex.to_string())
|
||||
.unwrap_or_else(|| "NULL".to_owned());
|
||||
|
||||
sqlparams.insert("sortindex".to_string(), sortindex);
|
||||
sqltypes.insert("sortindex".to_string(), SpannerType::Int64.into());
|
||||
}
|
||||
@ -1228,7 +1263,7 @@ impl SpannerDb {
|
||||
let now_millis = timestamp.as_i64();
|
||||
let ttl = bso
|
||||
.ttl
|
||||
.map_or(DEFAULT_BSO_TTL, |ttl| ttl.try_into().unwrap())
|
||||
.map_or(i64::from(DEFAULT_BSO_TTL), |ttl| ttl.try_into().unwrap())
|
||||
* 1000;
|
||||
let expirystring = to_rfc3339(now_millis + ttl)?;
|
||||
dbg!("!!!!! INSERT", &expirystring, timestamp, ttl);
|
||||
@ -1247,6 +1282,9 @@ impl SpannerDb {
|
||||
Ok(touch)
|
||||
}
|
||||
|
||||
// NOTE: Currently this post_bso_sync impl. is only used during db_tests,
|
||||
// see above for the non-tests version
|
||||
#[cfg(any(test, feature = "db_test"))]
|
||||
pub fn post_bsos_sync(&self, input: params::PostBsos) -> Result<results::PostBsos> {
|
||||
let collection_id = self.get_or_create_collection_id(&input.collection)?;
|
||||
let mut result = results::PostBsos {
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
#[cfg(not(any(test, feature = "db_test")))]
|
||||
use protobuf::well_known_types::NullValue;
|
||||
use protobuf::well_known_types::Struct;
|
||||
use protobuf::{
|
||||
well_known_types::{ListValue, Value},
|
||||
@ -10,48 +11,32 @@ use protobuf::{
|
||||
use super::models::{Conn, Result};
|
||||
use crate::db::{results, util::SyncTimestamp, DbError, DbErrorKind};
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
#[cfg(not(any(test, feature = "db_test")))]
|
||||
use crate::{
|
||||
db::{params, spanner::models::DEFAULT_BSO_TTL, util::to_rfc3339},
|
||||
web::extractors::HawkIdentifier,
|
||||
};
|
||||
|
||||
use googleapis_raw::spanner::v1::type_pb::{Type, TypeCode};
|
||||
|
||||
type ParamValue = protobuf::well_known_types::Value;
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
type ParamValue = String;
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
type ParamType = googleapis_raw::spanner::v1::type_pb::Type;
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
type ParamType = google_spanner1::Type;
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
pub type ExecuteSqlRequest = googleapis_raw::spanner::v1::spanner::ExecuteSqlRequest;
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
pub type ExecuteSqlRequest = google_spanner1::ExecuteSqlRequest;
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
type ResultSet = googleapis_raw::spanner::v1::result_set::ResultSet;
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
type ResultSet = google_spanner1::ResultSet;
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
type ResultSetMetadata = googleapis_raw::spanner::v1::result_set::ResultSetMetadata;
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
type ResultSetMetadata = google_spanner1::ResultSetMetadata;
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
type ResultSetStats = googleapis_raw::spanner::v1::result_set::ResultSetStats;
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
type ResultSetStats = google_spanner1::ResultSetStats;
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
pub fn as_value(string_value: String) -> protobuf::well_known_types::Value {
|
||||
let mut value = Value::new();
|
||||
value.set_string_value(string_value);
|
||||
value
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
pub fn as_value(string_value: String) -> String {
|
||||
string_value
|
||||
}
|
||||
|
||||
pub fn as_list_value(
|
||||
string_values: impl Iterator<Item = String>,
|
||||
) -> protobuf::well_known_types::Value {
|
||||
@ -79,11 +64,9 @@ pub enum SpannerType {
|
||||
Struct,
|
||||
}
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
impl Into<googleapis_raw::spanner::v1::type_pb::Type> for SpannerType {
|
||||
fn into(self) -> googleapis_raw::spanner::v1::type_pb::Type {
|
||||
let mut t = googleapis_raw::spanner::v1::type_pb::Type::new();
|
||||
use googleapis_raw::spanner::v1::type_pb::TypeCode;
|
||||
impl Into<Type> for SpannerType {
|
||||
fn into(self) -> Type {
|
||||
let mut t = Type::new();
|
||||
let code = match self {
|
||||
SpannerType::TypeCodeUnspecified => TypeCode::TYPE_CODE_UNSPECIFIED,
|
||||
SpannerType::Bool => TypeCode::BOOL,
|
||||
@ -101,27 +84,6 @@ impl Into<googleapis_raw::spanner::v1::type_pb::Type> for SpannerType {
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<google_spanner1::Type> for SpannerType {
|
||||
fn into(self) -> google_spanner1::Type {
|
||||
let code = match self {
|
||||
SpannerType::TypeCodeUnspecified => "TYPE_CODE_UNSPECIFIED",
|
||||
SpannerType::Bool => "BOOL",
|
||||
SpannerType::Int64 => "INT64",
|
||||
SpannerType::Float64 => "FLOAT64",
|
||||
SpannerType::Timestamp => "TIMESTAMP",
|
||||
SpannerType::Date => "DATE",
|
||||
SpannerType::String => "STRING",
|
||||
SpannerType::Bytes => "BYTES",
|
||||
SpannerType::Array => "ARRAY",
|
||||
SpannerType::Struct => "STRUCT",
|
||||
};
|
||||
google_spanner1::Type {
|
||||
code: Some(code.to_owned()),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct ExecuteSqlRequestBuilder {
|
||||
execute_sql: ExecuteSqlRequest,
|
||||
@ -147,7 +109,6 @@ impl ExecuteSqlRequestBuilder {
|
||||
self
|
||||
}
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
pub fn execute(self, spanner: &Conn) -> Result<SyncResultSet> {
|
||||
let mut request = self.execute_sql;
|
||||
request.set_session(spanner.session.get_name().to_owned());
|
||||
@ -162,26 +123,9 @@ impl ExecuteSqlRequestBuilder {
|
||||
let result = spanner.client.execute_sql(&request)?;
|
||||
Ok(SyncResultSet { result })
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
pub fn execute(self, spanner: &Conn) -> Result<SyncResultSet> {
|
||||
let session = spanner
|
||||
.session
|
||||
.name
|
||||
.as_ref()
|
||||
.ok_or_else(|| DbError::internal("No spanner session"))?;
|
||||
let mut request = self.execute_sql;
|
||||
request.params = self.params;
|
||||
request.param_types = self.param_types;
|
||||
let (_, result) = spanner
|
||||
.hub
|
||||
.projects()
|
||||
.instances_databases_sessions_execute_sql(request, session)
|
||||
.doit()?;
|
||||
Ok(SyncResultSet { result })
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct SyncResultSet {
|
||||
result: ResultSet,
|
||||
}
|
||||
@ -223,7 +167,6 @@ impl SyncResultSet {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
pub fn affected_rows(self: &SyncResultSet) -> Result<i64> {
|
||||
let stats = self
|
||||
.stats()
|
||||
@ -233,7 +176,6 @@ impl SyncResultSet {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "google_grpc")]
|
||||
impl Iterator for SyncResultSet {
|
||||
type Item = Vec<Value>;
|
||||
|
||||
@ -253,37 +195,6 @@ impl Iterator for SyncResultSet {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
impl Iterator for SyncResultSet {
|
||||
type Item = Vec<Value>;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
if let Some(rows) = self.result.rows.as_mut() {
|
||||
if rows.is_empty() {
|
||||
None
|
||||
} else {
|
||||
let row = rows.remove(0);
|
||||
Some(
|
||||
row.into_iter()
|
||||
.map(|s| {
|
||||
let mut value = Value::new();
|
||||
value.set_string_value(s);
|
||||
value
|
||||
})
|
||||
.collect(),
|
||||
)
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
let len = self.result.rows.len();
|
||||
(len, Some(len))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn bso_from_row(row: Vec<Value>) -> Result<results::GetBso> {
|
||||
Ok(results::GetBso {
|
||||
id: row[0].get_string_value().to_owned(),
|
||||
@ -302,3 +213,74 @@ pub fn bso_from_row(row: Vec<Value>) -> Result<results::GetBso> {
|
||||
expiry: SyncTimestamp::from_rfc3339(&row[4].get_string_value())?.as_i64(),
|
||||
})
|
||||
}
|
||||
|
||||
#[cfg(not(any(test, feature = "db_test")))]
|
||||
pub fn bso_to_insert_row(
|
||||
user_id: &HawkIdentifier,
|
||||
collection_id: i32,
|
||||
bso: params::PostCollectionBso,
|
||||
now: SyncTimestamp,
|
||||
) -> Result<ListValue> {
|
||||
let sortindex = bso
|
||||
.sortindex
|
||||
.map(|sortindex| as_value(sortindex.to_string()))
|
||||
.unwrap_or_else(|| {
|
||||
let mut value = Value::new();
|
||||
value.set_null_value(NullValue::NULL_VALUE);
|
||||
value
|
||||
});
|
||||
let ttl = bso.ttl.unwrap_or(DEFAULT_BSO_TTL);
|
||||
let expiry = to_rfc3339(now.as_i64() + (i64::from(ttl) * 1000))?;
|
||||
|
||||
let mut row = ListValue::new();
|
||||
row.set_values(RepeatedField::from_vec(vec![
|
||||
as_value(user_id.fxa_uid.clone()),
|
||||
as_value(user_id.fxa_kid.clone()),
|
||||
as_value(collection_id.to_string()),
|
||||
as_value(bso.id),
|
||||
sortindex,
|
||||
as_value(bso.payload.unwrap_or_default()),
|
||||
as_value(now.as_rfc3339()?),
|
||||
as_value(expiry),
|
||||
]));
|
||||
Ok(row)
|
||||
}
|
||||
|
||||
#[cfg(not(any(test, feature = "db_test")))]
|
||||
pub fn bso_to_update_row(
|
||||
user_id: &HawkIdentifier,
|
||||
collection_id: i32,
|
||||
bso: params::PostCollectionBso,
|
||||
now: SyncTimestamp,
|
||||
) -> Result<(Vec<&'static str>, ListValue)> {
|
||||
let mut columns = vec!["fxa_uid", "fxa_kid", "collection_id", "id"];
|
||||
let mut values = vec![
|
||||
as_value(user_id.fxa_uid.clone()),
|
||||
as_value(user_id.fxa_kid.clone()),
|
||||
as_value(collection_id.to_string()),
|
||||
as_value(bso.id),
|
||||
];
|
||||
|
||||
let modified = bso.payload.is_some() || bso.sortindex.is_some();
|
||||
if let Some(sortindex) = bso.sortindex {
|
||||
columns.push("sortindex");
|
||||
values.push(as_value(sortindex.to_string()));
|
||||
}
|
||||
if let Some(payload) = bso.payload {
|
||||
columns.push("payload");
|
||||
values.push(as_value(payload));
|
||||
}
|
||||
if modified {
|
||||
columns.push("modified");
|
||||
values.push(as_value(now.as_rfc3339()?));
|
||||
}
|
||||
if let Some(ttl) = bso.ttl {
|
||||
columns.push("expiry");
|
||||
let expiry = now.as_i64() + (i64::from(ttl) * 1000);
|
||||
values.push(as_value(to_rfc3339(expiry)?));
|
||||
}
|
||||
|
||||
let mut row = ListValue::new();
|
||||
row.set_values(RepeatedField::from_vec(values));
|
||||
Ok((columns, row))
|
||||
}
|
||||
|
||||
@ -1,7 +1,4 @@
|
||||
use diesel::r2d2::CustomizeConnection;
|
||||
#[cfg(not(feature = "google_grpc"))]
|
||||
use google_spanner1::Error;
|
||||
#[cfg(feature = "google_grpc")]
|
||||
use grpcio::Error;
|
||||
|
||||
use super::manager::SpannerSession;
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
//! Sync Storage Server for Sync 1.6
|
||||
//! Sync Storage Server for Sync 1.5
|
||||
use std::error::Error;
|
||||
|
||||
use docopt::Docopt;
|
||||
|
||||
@ -134,12 +134,7 @@ impl Settings {
|
||||
let db = Url::parse(&self.database_url)
|
||||
.map(|url| url.scheme().to_owned())
|
||||
.unwrap_or_else(|_| "<invalid db>".to_owned());
|
||||
let features = if cfg!(feature = "google_grpc") {
|
||||
"+google_grpc"
|
||||
} else {
|
||||
""
|
||||
};
|
||||
format!("http://{}:{} ({}{})", self.host, self.port, db, features)
|
||||
format!("http://{}:{} ({})", self.host, self.port, db)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@ use actix_web::{
|
||||
dev::{ConnectionInfo, Extensions, Payload},
|
||||
error::ErrorInternalServerError,
|
||||
http::{
|
||||
header::{HeaderMap, HeaderValue, ACCEPT, CONTENT_TYPE},
|
||||
header::{HeaderMap, HeaderName, HeaderValue, ACCEPT, CONTENT_TYPE},
|
||||
Uri,
|
||||
},
|
||||
web::{Json, Query},
|
||||
@ -87,6 +87,13 @@ impl BatchBsoBody {
|
||||
}
|
||||
}
|
||||
|
||||
fn get_trimmed_header(headers: &HeaderMap, key: HeaderName, default: &HeaderValue) -> String {
|
||||
let ct_raw = std::str::from_utf8(headers.get(key).unwrap_or(&default).as_bytes())
|
||||
.unwrap_or_else(|_| "invalid");
|
||||
let ct_parts: Vec<&str> = ct_raw.split(';').collect();
|
||||
ct_parts[0].trim_end().to_owned()
|
||||
}
|
||||
|
||||
#[derive(Default, Deserialize)]
|
||||
pub struct BsoBodies {
|
||||
pub valid: Vec<BatchBsoBody>,
|
||||
@ -111,14 +118,16 @@ impl FromRequest for BsoBodies {
|
||||
// Only try and parse the body if its a valid content-type
|
||||
let headers = req.headers();
|
||||
let default = HeaderValue::from_static("");
|
||||
let content_type = headers.get(CONTENT_TYPE).unwrap_or(&default).as_bytes();
|
||||
let content_type = get_trimmed_header(headers, CONTENT_TYPE, &default);
|
||||
|
||||
match content_type {
|
||||
b"application/json" | b"text/plain" | b"application/newlines" | b"" => (),
|
||||
dbg!(&content_type);
|
||||
|
||||
match content_type.as_str() {
|
||||
"application/json" | "text/plain" | "application/newlines" | "" => (),
|
||||
_ => {
|
||||
return Box::new(future::err(
|
||||
ValidationErrorKind::FromDetails(
|
||||
"Invalid Content-Type".to_owned(),
|
||||
format!("Invalid Content-Type {:?}", content_type),
|
||||
RequestErrorLocation::Header,
|
||||
Some("Content-Type".to_owned()),
|
||||
)
|
||||
@ -150,7 +159,7 @@ impl FromRequest for BsoBodies {
|
||||
|
||||
// Define a new bool to check from a static closure to release the reference on the
|
||||
// content_type header
|
||||
let newlines: bool = content_type == b"application/newlines";
|
||||
let newlines: bool = content_type == "application/newlines";
|
||||
|
||||
// Grab the max sizes
|
||||
let state = match req.app_data::<ServerState>() {
|
||||
@ -289,8 +298,9 @@ impl FromRequest for BsoBody {
|
||||
|
||||
let headers = req.headers();
|
||||
let default = HeaderValue::from_static("");
|
||||
match headers.get(CONTENT_TYPE).unwrap_or(&default).as_bytes() {
|
||||
b"application/json" | b"text/plain" | b"" => (),
|
||||
let content_type = get_trimmed_header(&headers, CONTENT_TYPE, &default);
|
||||
match content_type.as_str() {
|
||||
"application/json" | "text/plain" | "" => (),
|
||||
_ => {
|
||||
return Box::new(future::err(
|
||||
ValidationErrorKind::FromDetails(
|
||||
@ -550,10 +560,12 @@ impl FromRequest for CollectionRequest {
|
||||
let db = <Box<dyn Db>>::from_request(req, payload)?;
|
||||
let query = BsoQueryParams::from_request(req, payload)?;
|
||||
let collection = CollectionParam::from_request(req, payload)?.collection;
|
||||
let reply = match req.headers().get(ACCEPT) {
|
||||
Some(v) if v.as_bytes() == b"application/newlines" => ReplyFormat::Newlines,
|
||||
Some(v) if v.as_bytes() == b"application/json" => ReplyFormat::Json,
|
||||
Some(_) => {
|
||||
let content_type =
|
||||
get_trimmed_header(&req.headers(), ACCEPT, &HeaderValue::from_static(""));
|
||||
let reply = match content_type.as_str() {
|
||||
"application/newlines" => ReplyFormat::Newlines,
|
||||
"application/json" | "" => ReplyFormat::Json,
|
||||
_ => {
|
||||
return Err(ValidationErrorKind::FromDetails(
|
||||
"Invalid accept".to_string(),
|
||||
RequestErrorLocation::Header,
|
||||
@ -561,7 +573,6 @@ impl FromRequest for CollectionRequest {
|
||||
)
|
||||
.into());
|
||||
}
|
||||
None => ReplyFormat::Json,
|
||||
};
|
||||
|
||||
Ok(CollectionRequest {
|
||||
@ -1475,7 +1486,8 @@ mod tests {
|
||||
.data(state)
|
||||
.method(Method::POST)
|
||||
.header("authorization", header)
|
||||
.header("content-type", "application/json")
|
||||
.header("content-type", "application/json; charset=UTF-8")
|
||||
.header("accept", "application/json;q=0.9,/;q=0.2")
|
||||
//.set_json(body)
|
||||
.set_payload(bod_str.as_bytes())
|
||||
.param("uid", &USER_ID_STR)
|
||||
@ -1662,6 +1674,7 @@ mod tests {
|
||||
let req = TestRequest::with_uri(&uri)
|
||||
.data(state)
|
||||
.header("authorization", header)
|
||||
.header("accept", "application/json;a=0.9,/;q=0.2")
|
||||
.method(Method::GET)
|
||||
.param("uid", &USER_ID_STR)
|
||||
.param("collection", "tabs")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user