History

TimeSeriesPlatformLibrary: Added temporal support options to DataPublisher interfaces.

J. Ritchie Carroll committed 7 years ago

Commit 5c5b4061 parent 04505f228 files · +603 −300Browse files

Showing the changes to Source/Libraries/TimeSeriesPlatformLibrary/Common (5 of 28 files). Show all

Unified · Split

5 files
  1. Source/Libraries/TimeSeriesPlatformLibrary/Common/CommonTypes.cpp +12 −8
  2. Source/Libraries/TimeSeriesPlatformLibrary/Common/CommonTypes.h +21 −9
  3. Source/Libraries/TimeSeriesPlatformLibrary/Common/Convert.cpp +49 −17
  4. Source/Libraries/TimeSeriesPlatformLibrary/Common/Convert.h +12 −8
  5. Source/Libraries/TimeSeriesPlatformLibrary/Common/Nullable.h +1 −1
Source/Libraries/TimeSeriesPlatformLibrary/Common/CommonTypes.cpp+12−8
@@ -45,9 +45,13 @@ const decimal_t Decimal::DotNetMaxValue = decimal_t("792281625142643375935439503 · 44 unmodified lines
4545
4646 const decimal_t Decimal::DotNetMinValue = decimal_t("-79228162514264337593543950335");
4747
48+const datetime_t DateTime::MaxValue(max_date_time);
49+
50+const datetime_t DateTime::MinValue(min_date_time);
51+
4852 const string Empty::String {};
4953
50−const DateTime Empty::DateTime {};
54+const datetime_t Empty::DateTime {};
5155
5256 const Guid Empty::Guid = NilGuidGen();
5357
@@ -280,7 +284,7 @@ string GSF::PadRight(const string& value, uint32_t count, char padChar) · 226 unmodified lines
280284 return value;
281285 }
282286
283−DateTime GSF::DateAdd(const DateTime& value, int32_t addValue, TimeInterval interval)
287+datetime_t GSF::DateAdd(const datetime_t& value, int32_t addValue, TimeInterval interval)
284288 {
285289 switch (interval)
286290 {
@@ -307,7 +311,7 @@ DateTime GSF::DateAdd(const DateTime& value, int32_t addValue, TimeInterval inte · 20 unmodified lines
307311 }
308312 }
309313
310−int32_t GSF::DateDiff(const DateTime& startTime, const DateTime& endTime, TimeInterval interval)
314+int32_t GSF::DateDiff(const datetime_t& startTime, const datetime_t& endTime, TimeInterval interval)
311315 {
312316 if (interval < TimeInterval::Hour)
313317 {
@@ -345,7 +349,7 @@ int32_t GSF::DateDiff(const DateTime& startTime, const DateTime& endTime, TimeIn · 31 unmodified lines
345349 }
346350 }
347351
348−int32_t GSF::DatePart(const DateTime& value, TimeInterval interval)
352+int32_t GSF::DatePart(const datetime_t& value, TimeInterval interval)
349353 {
350354 static float64_t tickInterval = pow(10.0, time_duration::num_fractional_digits());
351355
@@ -376,12 +380,12 @@ int32_t GSF::DatePart(const DateTime& value, TimeInterval interval) · 24 unmodified lines
376380 }
377381 }
378382
379−DateTime GSF::Now()
383+datetime_t GSF::Now()
380384 {
381− return DateTime { microsec_clock::local_time() };
385+ return datetime_t { microsec_clock::local_time() };
382386 }
383387
384−DateTime GSF::UtcNow()
388+datetime_t GSF::UtcNow()
385389 {
386− return DateTime { microsec_clock::universal_time() };
390+ return datetime_t { microsec_clock::universal_time() };
387391 }
Source/Libraries/TimeSeriesPlatformLibrary/Common/CommonTypes.h+21−9
@@ -48,6 +48,9 @@ namespace GSF · 47 unmodified lines
4848 typedef double_t float64_t;
4949 typedef boost::multiprecision::cpp_dec_float_100 decimal_t;
5050
51+ // DateTime type
52+ typedef boost::posix_time::ptime datetime_t;
53+
5154 struct Int8
5255 {
5356 static const int8_t MaxValue = static_cast<int8_t>(127);
@@ -105,16 +108,26 @@ namespace GSF · 51 unmodified lines
105108 static const decimal_t DotNetMinValue;
106109 };
107110
111+ struct DateTime
112+ {
113+ static const datetime_t MaxValue;
114+ static const datetime_t MinValue;
115+ };
116+
108117 struct Ticks
109118 {
119+ static const int64_t MaxValue = 3155378975999999999L; // 12/31/1999 11:59:59.999
120+ static const int64_t MinValue = 0L; // 01/01/0001 00:00:00.000
121+
122+ static const int64_t UnixBaseOffset = 621355968000000000L; // 01/01/1970 00:00:00.000
123+ static const int64_t PTimeBaseOffset = 441481536000000000L; // 01/01/1400 00:00:00.000
124+
110125 static const int64_t PerSecond = 10000000L;
111126 static const int64_t PerMillisecond = Ticks::PerSecond / 1000;
112127 static const int64_t PerMicrosecond = Ticks::PerSecond / 1000000;
113128 static const int64_t PerMinute = 60L * Ticks::PerSecond;
114129 static const int64_t PerHour = 60L * Ticks::PerMinute;
115130 static const int64_t PerDay = 24L * Ticks::PerHour;
116− static const int64_t UnixBaseOffset = 621355968000000000L; // 01/01/1970 00:00:00
117− static const int64_t PtimeBaseOffset = 441481536000000000L; // 01/01/1400 00:00:00
118131 };
119132
120133 template<class T>
@@ -167,7 +180,6 @@ namespace GSF · 46 unmodified lines
167180
168181 typedef boost::any Object;
169182 typedef boost::uuids::uuid Guid;
170− typedef boost::posix_time::ptime DateTime;
171183 typedef boost::posix_time::time_duration TimeSpan;
172184 typedef boost::system::error_code ErrorCode;
173185 typedef boost::system::system_error SystemError;
@@ -192,7 +204,7 @@ namespace GSF · 18 unmodified lines
192204 struct Empty
193205 {
194206 static const std::string String;
195− static const GSF::DateTime DateTime;
207+ static const GSF::datetime_t DateTime;
196208 static const GSF::Guid Guid;
197209 static const GSF::Object Object;
198210 static const GSF::IPAddress IPAddress;
@@ -394,11 +406,11 @@ namespace GSF · 195 unmodified lines
394406 Millisecond
395407 };
396408
397− DateTime DateAdd(const DateTime& value, int32_t addValue, TimeInterval interval);
398− int32_t DateDiff(const DateTime& startTime, const DateTime& endTime, TimeInterval interval);
399− int32_t DatePart(const DateTime& value, TimeInterval interval);
400− DateTime Now();
401− DateTime UtcNow();
409+ datetime_t DateAdd(const datetime_t& value, int32_t addValue, TimeInterval interval);
410+ int32_t DateDiff(const datetime_t& startTime, const datetime_t& endTime, TimeInterval interval);
411+ int32_t DatePart(const datetime_t& value, TimeInterval interval);
412+ datetime_t Now();
413+ datetime_t UtcNow();
402414 }
403415
404416 // Setup standard hash code for Guid
Source/Libraries/TimeSeriesPlatformLibrary/Common/Convert.cpp+49−17
@@ -40,7 +40,7 @@ using namespace boost::posix_time; · 39 unmodified lines
4040 using namespace boost::gregorian;
4141 using namespace GSF;
4242
43−const DateTime DateTimeEpoch(date(1400, 1, 1), time_duration(0, 0, 0));
43+const datetime_t DateTimeEpoch(date(1400, 1, 1), time_duration(0, 0, 0));
4444 const auto DateTimeTicksPerSecond = time_duration::ticks_per_second();
4545
4646 string PreparseTimestamp(const string& timestamp, time_duration& utcOffset)
@@ -161,24 +161,24 @@ void GSF::ToUnixTime(const int64_t ticks, time_t& unixSOC, uint16_t& millisecond · 114 unmodified lines
161161 milliseconds = static_cast<uint16_t>(ticks / 10000 % 1000);
162162 }
163163
164−DateTime GSF::FromUnixTime(time_t unixSOC, uint16_t milliseconds)
164+datetime_t GSF::FromUnixTime(time_t unixSOC, uint16_t milliseconds)
165165 {
166166 return from_time_t(unixSOC) + boost::posix_time::milliseconds(milliseconds);
167167 }
168168
169−DateTime GSF::FromTicks(const int64_t ticks)
169+datetime_t GSF::FromTicks(const int64_t ticks)
170170 {
171171 static float64_t tickInterval = float64_t(Ticks::PerSecond);
172− const DateTime time = from_time_t((ticks - Ticks::UnixBaseOffset) / Ticks::PerSecond);
172+ const datetime_t time = from_time_t((ticks - Ticks::UnixBaseOffset) / Ticks::PerSecond);
173173 const int64_t pticks = int64_t(ticks % Ticks::PerSecond / tickInterval * DateTimeTicksPerSecond);
174174 return time + time_duration(0, 0, 0, pticks % DateTimeTicksPerSecond);
175175 }
176176
177−int64_t GSF::ToTicks(const DateTime& time)
177+int64_t GSF::ToTicks(const datetime_t& time)
178178 {
179179 static float64_t tickInterval = pow(10.0, time_duration::num_fractional_digits());
180180 const time_duration offset = time - DateTimeEpoch;
181− return Ticks::PtimeBaseOffset + offset.total_seconds() * Ticks::PerSecond +
181+ return Ticks::PTimeBaseOffset + offset.total_seconds() * Ticks::PerSecond +
182182 int64_t(offset.fractional_seconds() / tickInterval * Ticks::PerSecond);
183183 }
184184
@@ -240,9 +240,9 @@ uint32_t GSF::TicksToString(char* ptr, uint32_t maxsize, string format, int64_t · 55 unmodified lines
240240 return strftime(ptr, maxsize, formatStream.str().data(), &timeinfo);
241241 }
242242
243−DateTime GSF::LocalFromUtc(const DateTime& timestamp)
243+datetime_t GSF::LocalFromUtc(const datetime_t& timestamp)
244244 {
245− return boost::date_time::c_local_adjustor<DateTime>::utc_to_local(timestamp);
245+ return boost::date_time::c_local_adjustor<datetime_t>::utc_to_local(timestamp);
246246 }
247247
248248 std::string GSF::ToString(const Guid& value)
@@ -250,7 +250,7 @@ std::string GSF::ToString(const Guid& value) · 1 unmodified line
250250 return boost::uuids::to_string(value);
251251 }
252252
253−std::string GSF::ToString(const DateTime& value, const char* format)
253+std::string GSF::ToString(const datetime_t& value, const char* format)
254254 {
255255 stringstream stream;
256256 time_facet* facet = new time_facet(format);
@@ -309,7 +309,35 @@ bool GSF::ParseBoolean(const string& value) · 52 unmodified lines
309309 return false;
310310 }
311311
312−bool GSF::TryParseDouble(const string& value, float64_t& result)
312+bool GSF::TryParseInt32(const std::string& value, int32_t& result, const int32_t defaultValue)
313+{
314+ try
315+ {
316+ result = stoi(value);
317+ return true;
318+ }
319+ catch (...)
320+ {
321+ result = defaultValue;
322+ return false;
323+ }
324+}
325+
326+bool GSF::TryParseInt64(const std::string& value, int64_t& result, const int64_t defaultValue)
327+{
328+ try
329+ {
330+ result = stoll(value);
331+ return true;
332+ }
333+ catch (...)
334+ {
335+ result = defaultValue;
336+ return false;
337+ }
338+}
339+
340+bool GSF::TryParseDouble(const string& value, float64_t& result, const float64_t defaultValue)
313341 {
314342 try
315343 {
@@ -318,6 +346,7 @@ bool GSF::TryParseDouble(const string& value, float64_t& result) · 2 unmodified lines
318346 }
319347 catch (...)
320348 {
349+ result = defaultValue;
321350 return false;
322351 }
323352 }
@@ -428,8 +457,8 @@ const char* GSF::Coalesce(const char* data, const char* nonEmptyValue) · 104 unmodified lines
428457 return data;
429458 }
430459
431−// Parse a timestamp string, e.g.: 2018-03-14T19:23:11.665-04:00
432−bool GSF::TryParseTimestamp(const char* time, DateTime& timestamp, bool parseAsUTC)
460+// Attempt to parse a timestamp string, e.g.: 2018-03-14T19:23:11.665-04:00
461+bool GSF::TryParseTimestamp(const char* time, datetime_t& timestamp, const datetime_t& defaultValue, bool parseAsUTC)
433462 {
434463 static const locale formats[] = {
435464 locale(locale::classic(), new time_input_facet("%Y-%m-%d %H:%M:%S%F")),
@@ -438,10 +467,12 @@ bool GSF::TryParseTimestamp(const char* time, DateTime& timestamp, bool parseAsU · 2 unmodified lines
438467
439468 static const int32_t formatsCount = sizeof(formats) / sizeof(formats[0]);
440469
470+ time_duration utcOffset{};
471+ const string cleanTimestamp = PreparseTimestamp(time, utcOffset);
472+
441473 for (int32_t i = 0; i < formatsCount; i++)
442474 {
443− time_duration utcOffset{};
444− istringstream stream(PreparseTimestamp(time, utcOffset));
475+ istringstream stream(cleanTimestamp);
445476
446477 stream.imbue(formats[i]);
447478 stream >> timestamp;
@@ -455,14 +486,15 @@ bool GSF::TryParseTimestamp(const char* time, DateTime& timestamp, bool parseAsU · 7 unmodified lines
455486 }
456487 }
457488
489+ timestamp = defaultValue;
458490 return false;
459491 }
460492
461−DateTime GSF::ParseTimestamp(const char* time, bool parseAsUTC)
493+datetime_t GSF::ParseTimestamp(const char* time, bool parseAsUTC)
462494 {
463− DateTime timestamp;
495+ datetime_t timestamp;
464496
465− if (TryParseTimestamp(time, timestamp, parseAsUTC))
497+ if (TryParseTimestamp(time, timestamp, DateTime::MinValue, parseAsUTC))
466498 return timestamp;
467499
468500 throw runtime_error("Failed to parse timestamp \"" + string(time) + "\"");
Source/Libraries/TimeSeriesPlatformLibrary/Common/Convert.h+12−8
@@ -32,18 +32,18 @@ namespace GSF · 31 unmodified lines
3232 void ToUnixTime(int64_t ticks, time_t& unixSOC, uint16_t& milliseconds);
3333
3434 // Convert Unix second of century and milliseconds to DateTime
35− DateTime FromUnixTime(time_t unixSOC, uint16_t milliseconds);
35+ datetime_t FromUnixTime(time_t unixSOC, uint16_t milliseconds);
3636
3737 // Converts a timestamp, in Ticks, to DateTime
38− DateTime FromTicks(int64_t ticks);
38+ datetime_t FromTicks(int64_t ticks);
3939
4040 // Converts a DateTime to Ticks
41− int64_t ToTicks(const DateTime& time);
41+ int64_t ToTicks(const datetime_t& time);
4242
4343 // Thin wrapper around strftime to provide formats for milliseconds (%f) and full-resolution ticks (%t)
4444 uint32_t TicksToString(char* ptr, uint32_t maxsize, std::string format, int64_t ticks);
4545
46− DateTime LocalFromUtc(const DateTime& timestamp);
46+ datetime_t LocalFromUtc(const datetime_t& timestamp);
4747
4848 // Converts an object to a string
4949 template<class T>
@@ -56,7 +56,7 @@ namespace GSF · 6 unmodified lines
5656
5757 std::string ToString(const Guid& value);
5858
59− std::string ToString(const DateTime& value, const char* format = "%Y-%m-%d %H:%M:%S%F");
59+ std::string ToString(const datetime_t& value, const char* format = "%Y-%m-%d %H:%M:%S%F");
6060
6161 std::string ToString(const TimeSpan& value);
6262
@@ -74,7 +74,11 @@ namespace GSF · 11 unmodified lines
7474
7575 bool ParseBoolean(const std::string& value);
7676
77− bool TryParseDouble(const std::string& value, float64_t& result);
77+ bool TryParseInt32(const std::string& value, int32_t& result, int32_t defaultValue = 0);
78+
79+ bool TryParseInt64(const std::string& value, int64_t& result, int64_t defaultValue = 0L);
80+
81+ bool TryParseDouble(const std::string& value, float64_t& result, float64_t defaultValue = 0.0);
7882
7983 // Encodes a character value into an escaped RegEx value
8084 std::string RegExEncode(char value);
@@ -88,10 +92,10 @@ namespace GSF · 7 unmodified lines
8892 const char* Coalesce(const char* data, const char* nonEmptyValue);
8993
9094 // Attempts to parse an time string in several common formats
91− bool TryParseTimestamp(const char* time, DateTime& timestamp, bool parseAsUTC = true);
95+ bool TryParseTimestamp(const char* time, datetime_t& timestamp, const datetime_t& defaultValue = DateTime::MinValue, bool parseAsUTC = true);
9296
9397 // Converts a string to a date-time that may be in several common formats
94− DateTime ParseTimestamp(const char* time, bool parseAsUTC = true);
98+ datetime_t ParseTimestamp(const char* time, bool parseAsUTC = true);
9599
96100 // Parses a string of key/value pairs into a case-insensitive string dictionary
97101 StringMap<std::string> ParseKeyValuePairs(const std::string& value, char parameterDelimiter = ';', char keyValueDelimiter = '=', char startValueDelimiter = '{', char endValueDelimiter = '}');
Source/Libraries/TimeSeriesPlatformLibrary/Common/Nullable.h+1−1
@@ -324,7 +324,7 @@ namespace GSF · 323 unmodified lines
324324 return {};
325325 }
326326
327− inline std::string ToString(const Nullable<DateTime>& value, const char* fmt = "%Y-%m-%d %H:%M:%S%F")
327+ inline std::string ToString(const Nullable<datetime_t>& value, const char* fmt = "%Y-%m-%d %H:%M:%S%F")
328328 {
329329 if (value.HasValue())
330330 return ToString(value.GetValueOrDefault(), fmt);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t