An Ecto SQLite3 adapter.
0

Configure Feed

Select the types of activity you want to include in your feed.

fix: Retain float microsecond value when formatting datetime

Matthew Johnston (Sep 4, 2024, 9:50 PM -0500) 3db4da0f 83d4a32b

+29 -26
+3 -7
lib/ecto/adapters/sqlite3/codec.ex
··· 114 114 end 115 115 116 116 @text_datetime_format "%Y-%m-%d %H:%M:%S" 117 - @iso8601_format "%Y-%m-%dT%H:%M:%S" 118 - 119 - def datetime_format(:text_datetime), do: @text_datetime_format 120 - def datetime_format(_), do: @iso8601_format 121 117 122 118 def utc_datetime_encode(nil, :iso8601), do: {:ok, nil} 123 119 def utc_datetime_encode(nil, :text_datetime), do: {:ok, nil} 124 120 125 - def utc_datetime_encode(%{time_zone: "Etc/UTC"} = value, :iso8601) do 126 - {:ok, Calendar.strftime(value, @iso8601_format)} 121 + def utc_datetime_encode(%DateTime{time_zone: "Etc/UTC"} = value, :iso8601) do 122 + {:ok, DateTime.to_iso8601(value)} 127 123 end 128 124 129 125 def utc_datetime_encode(%{time_zone: "Etc/UTC"} = value, :text_datetime) do ··· 139 135 def naive_datetime_encode(nil, :text_datetime), do: {:ok, nil} 140 136 141 137 def naive_datetime_encode(value, :iso8601) do 142 - {:ok, Calendar.strftime(value, @iso8601_format)} 138 + {:ok, NaiveDateTime.to_iso8601(value)} 143 139 end 144 140 145 141 def naive_datetime_encode(value, :text_datetime) do
+8 -1
lib/ecto/adapters/sqlite3/connection.ex
··· 1372 1372 @datetime_type Application.compile_env(:ecto_sqlite3, :datetime_type, :iso8601) 1373 1373 1374 1374 defp expr({:datetime_add, _, [datetime, count, interval]}, sources, query) do 1375 - format = Ecto.Adapters.SQLite3.Codec.datetime_format(@datetime_type) 1375 + format = 1376 + case @datetime_type do 1377 + :text_datetime -> 1378 + "%Y-%m-%d %H:%M:%f000Z" 1379 + 1380 + _ -> 1381 + "%Y-%m-%dT%H:%M:%f000Z" 1382 + end 1376 1383 1377 1384 [ 1378 1385 "CAST (",
+15 -15
test/ecto/adapters/sqlite3/codec_test.exs
··· 144 144 end 145 145 146 146 describe ".utc_datetime_encode/2" do 147 - setup do 148 - [dt: ~U[2021-08-25 10:58:59Z]] 149 - end 150 - 151 147 test "nil" do 152 148 assert {:ok, nil} = Codec.utc_datetime_encode(nil, :iso8601) 153 149 assert {:ok, nil} = Codec.utc_datetime_encode(nil, :text_datetime) 154 150 end 155 151 156 - test "iso8601", %{dt: dt} do 157 - dt_str = "2021-08-25T10:58:59" 152 + test "iso8601" do 153 + dt = ~U[2021-08-25 10:58:59Z] 154 + dt_str = "2021-08-25T10:58:59Z" 158 155 assert {:ok, ^dt_str} = Codec.utc_datetime_encode(dt, :iso8601) 159 156 end 160 157 161 - test ":text_datetime", %{dt: dt} do 158 + test ":text_datetime" do 159 + dt = ~U[2021-08-25 10:58:59Z] 162 160 dt_str = "2021-08-25 10:58:59" 163 161 assert {:ok, ^dt_str} = Codec.utc_datetime_encode(dt, :text_datetime) 164 162 end 165 163 166 - test "unknown datetime type", %{dt: dt} do 164 + test "unknown datetime type" do 165 + dt = ~U[2021-08-25 10:58:59Z] 166 + 167 167 msg = 168 168 "expected datetime type to be either `:iso8601` or `:text_datetime`, but received `:whatsthis`" 169 169 ··· 174 174 end 175 175 176 176 describe ".naive_datetime_encode/2" do 177 - setup do 178 - [dt: ~U[2021-08-25 10:58:59Z], dt_str: "2021-08-25T10:58:59"] 179 - end 180 - 181 177 test "nil" do 182 178 assert {:ok, nil} = Codec.naive_datetime_encode(nil, :iso8601) 183 179 assert {:ok, nil} = Codec.naive_datetime_encode(nil, :text_datetime) 184 180 end 185 181 186 - test "iso8601", %{dt: dt} do 182 + test "iso8601" do 183 + dt = ~U[2021-08-25 10:58:59Z] 187 184 dt_str = "2021-08-25T10:58:59" 188 185 assert {:ok, ^dt_str} = Codec.naive_datetime_encode(dt, :iso8601) 189 186 end 190 187 191 - test ":text_datetime", %{dt: dt} do 188 + test ":text_datetime" do 189 + dt = ~U[2021-08-25 10:58:59Z] 192 190 dt_str = "2021-08-25 10:58:59" 193 191 assert {:ok, ^dt_str} = Codec.naive_datetime_encode(dt, :text_datetime) 194 192 end 195 193 196 - test "unknown datetime type", %{dt: dt} do 194 + test "unknown datetime type" do 195 + dt = ~U[2021-08-25 10:58:59Z] 196 + 197 197 msg = 198 198 "expected datetime type to be either `:iso8601` or `:text_datetime`, but received `:whatsthis`" 199 199
+2 -2
test/ecto/adapters/sqlite3/connection/datetime_add_test.exs
··· 11 11 |> select([], true) 12 12 |> plan() 13 13 14 - assert ~s{SELECT 1 FROM "schema" AS s0 WHERE (CAST (strftime('%Y-%m-%dT%H:%M:%S',s0.\"foo\",1 || ' month') AS TEXT) > s0."bar")} == 14 + assert ~s{SELECT 1 FROM "schema" AS s0 WHERE (CAST (strftime('%Y-%m-%dT%H:%M:%f000Z',s0.\"foo\",1 || ' month') AS TEXT) > s0."bar")} == 15 15 all(query) 16 16 end 17 17 ··· 22 22 |> select([], true) 23 23 |> plan() 24 24 25 - assert ~s{SELECT 1 FROM "schema" AS s0 WHERE (CAST (strftime('%Y-%m-%dT%H:%M:%S',CAST(s0.\"foo\" AS TEXT),1 || ' month') AS TEXT) > s0."bar")} == 25 + assert ~s{SELECT 1 FROM "schema" AS s0 WHERE (CAST (strftime('%Y-%m-%dT%H:%M:%f000Z',CAST(s0.\"foo\" AS TEXT),1 || ' month') AS TEXT) > s0."bar")} == 26 26 all(query) 27 27 end 28 28 end
+1 -1
test/ecto/integration/timestamps_test.exs
··· 197 197 }) 198 198 199 199 assert [ 200 - %{name: "Foo"}, 200 + %{name: "Foo"} 201 201 ] = 202 202 Product 203 203 |> select([p], p)