1#![allow(
12 clippy::cast_possible_wrap,
13 clippy::cast_precision_loss,
14 clippy::cast_sign_loss,
15 clippy::too_many_lines,
16 clippy::option_if_let_else,
17 clippy::manual_let_else
18)]
19#![forbid(unsafe_code)]
55#![warn(missing_docs)]
56#![cfg_attr(docsrs, feature(doc_cfg))]
57
58use std::time::{SystemTime, UNIX_EPOCH};
59
60#[cfg(feature = "connectors")]
61pub mod connector;
62#[cfg(feature = "connectors")]
63pub mod connectors;
64mod error;
65mod in_memory;
66mod model;
67#[cfg(feature = "sqlite")]
68mod sqlite;
69mod store;
70
71#[cfg(feature = "connectors")]
72pub use connector::{
73 Column, ColumnType, Connector, ConnectorAuth, ConnectorConfig, FileConnector, PullStream,
74 Schema, SslMode, SyncStrategy,
75};
76#[cfg(feature = "connectors")]
77pub use connectors::{MysqlConnector, PostgresConnector};
78pub use error::{ThingdError, ThingdResult};
79pub use in_memory::MemoryEngine;
80pub use model::{
81 AggregateFunction, AggregateGroupResult, AggregateOptions, AggregateResult, CollectionSchema,
82 DEFAULT_QUEUE_LEASE_MS, FieldSchema, Link, LinkDirection, LinkQueryOptions, ListEventsOptions,
83 ListObjectsOptions, MemoryEvent, MemoryObject, ObjectKey, PutObjectOptions, QueueClaimOptions,
84 QueueJob, QueueJobStatus, QueueNackOptions, SchemaOptions, SearchHit, SearchOptions, SortBy,
85 SortDirection, TimeBucket, TimeSeriesBucket, TimeSeriesOptions, TimeSeriesResult,
86};
87#[cfg(feature = "sqlite")]
88#[cfg_attr(docsrs, doc(cfg(feature = "sqlite")))]
89pub use sqlite::{SQLITE_SCHEMA_VERSION, SqliteThingStore};
90pub use store::{
91 AggregateStore, EventLog, LinkStore, ObjectStore, QueueStore, Searcher, ThingStore,
92};
93
94pub(crate) fn unix_timestamp_millis() -> i64 {
95 let Ok(duration) = SystemTime::now().duration_since(UNIX_EPOCH) else {
96 #[cfg(debug_assertions)]
97 panic!("SystemTime::now is before UNIX epoch — clock is broken");
98 #[cfg(not(debug_assertions))]
99 {
100 return 0;
101 }
102 };
103
104 i64::try_from(duration.as_millis()).unwrap_or(i64::MAX)
105}
106
107pub(crate) fn u64_to_i64(value: u64) -> i64 {
108 i64::try_from(value).unwrap_or(i64::MAX)
109}
110
111pub(crate) fn now_iso_string() -> String {
112 chrono::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Millis, true)
113}