From 0b9c490478a5eb401ccb4f57d2b10e293ef890e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Juc=C3=A1?= Date: Thu, 4 May 2023 20:05:17 -0300 Subject: [PATCH 1/3] Add missing column type map `:date` to `TEXT` --- lib/ecto/adapters/sqlite3/codec.ex | 9 +++++++++ lib/ecto/adapters/sqlite3/data_type.ex | 1 + 2 files changed, 10 insertions(+) diff --git a/lib/ecto/adapters/sqlite3/codec.ex b/lib/ecto/adapters/sqlite3/codec.ex index fae10a4..d685204 100644 --- a/lib/ecto/adapters/sqlite3/codec.ex +++ b/lib/ecto/adapters/sqlite3/codec.ex @@ -68,6 +68,15 @@ defmodule Ecto.Adapters.SQLite3.Codec do end end + def date_encode(val), do: date_encode(val, :iso8601) + + def date_encode(val, :iso8601) do + case Date.to_iso8601(val) do + date when is_bitstring(date) -> {:ok, date} + _ -> :error + end + end + def time_decode(nil), do: {:ok, nil} def time_decode(value) do diff --git a/lib/ecto/adapters/sqlite3/data_type.ex b/lib/ecto/adapters/sqlite3/data_type.ex index f4f5cc8..f15958b 100644 --- a/lib/ecto/adapters/sqlite3/data_type.ex +++ b/lib/ecto/adapters/sqlite3/data_type.ex @@ -20,6 +20,7 @@ defmodule Ecto.Adapters.SQLite3.DataType do def column_type(:array, _opts), do: "TEXT" def column_type({:map, _}, _opts), do: "TEXT" def column_type({:array, _}, _opts), do: "TEXT" + def column_type(:date, _opts), do: "TEXT" def column_type(:utc_datetime, _opts), do: "TEXT" def column_type(:utc_datetime_usec, _opts), do: "TEXT" def column_type(:naive_datetime, _opts), do: "TEXT" From 3d185b973ffe3e1ddd1f2b1aa09be82a33e3325e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Juc=C3=A1?= Date: Fri, 5 May 2023 13:04:39 -0300 Subject: [PATCH 2/3] Add tests for Ecto.Adapters.SQLite3.Codec.date_encode/2 --- test/ecto/adapters/sqlite3/codec_test.exs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/ecto/adapters/sqlite3/codec_test.exs b/test/ecto/adapters/sqlite3/codec_test.exs index 922ddf0..6fb2a6b 100644 --- a/test/ecto/adapters/sqlite3/codec_test.exs +++ b/test/ecto/adapters/sqlite3/codec_test.exs @@ -176,4 +176,21 @@ defmodule Ecto.Adapters.SQLite3.CodecTest do end end end + + describe ".date_encode/2" do + setup do + [ + date: ~D[2011-01-09], + datetime: ~U[2011-01-09 08:46:08.00Z] + ] + end + + test "on %Date{} structs", %{date: date} do + {:ok, "2011-01-09"} = Codec.date_encode(date, :iso8601) + end + + test "on %DateTime{} structs", %{datetime: datetime} do + {:ok, "2011-01-09"} = Codec.date_encode(datetime, :iso8601) + end + end end From 2cf6884207d101209d643ea2d030b323e0e33aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Juc=C3=A1?= Date: Sat, 6 May 2023 23:56:53 -0300 Subject: [PATCH 3/3] Makes date_encode/2 require Date structs --- lib/ecto/adapters/sqlite3/codec.ex | 2 +- test/ecto/adapters/sqlite3/codec_test.exs | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/ecto/adapters/sqlite3/codec.ex b/lib/ecto/adapters/sqlite3/codec.ex index d685204..f110a6f 100644 --- a/lib/ecto/adapters/sqlite3/codec.ex +++ b/lib/ecto/adapters/sqlite3/codec.ex @@ -70,7 +70,7 @@ defmodule Ecto.Adapters.SQLite3.Codec do def date_encode(val), do: date_encode(val, :iso8601) - def date_encode(val, :iso8601) do + def date_encode(%Date{} = val, :iso8601) do case Date.to_iso8601(val) do date when is_bitstring(date) -> {:ok, date} _ -> :error diff --git a/test/ecto/adapters/sqlite3/codec_test.exs b/test/ecto/adapters/sqlite3/codec_test.exs index 6fb2a6b..f7bfa9e 100644 --- a/test/ecto/adapters/sqlite3/codec_test.exs +++ b/test/ecto/adapters/sqlite3/codec_test.exs @@ -188,9 +188,5 @@ defmodule Ecto.Adapters.SQLite3.CodecTest do test "on %Date{} structs", %{date: date} do {:ok, "2011-01-09"} = Codec.date_encode(date, :iso8601) end - - test "on %DateTime{} structs", %{datetime: datetime} do - {:ok, "2011-01-09"} = Codec.date_encode(datetime, :iso8601) - end end end