Hello,
I have recently started using postmodern in a project. I need to store enum
values (of many different types) in a class. I have declared a LISP type
(deftype season-type () '(member winter spring summer autumn))
and I have functions that convert the above symbols to the numbers 0..3 and
vice-versa, if needed.
-- I have tried to emulate enum types with
(defclass my-type ()
((id :initarg :id :col-type bigint)
(season :initarg :season :col-type smallint))
(:metaclass dao-class)
(:keys id))
CREATE TABLE valid_seasons (
id SERIAL PRIMARY KEY NOT NULL,
season TEXT
);
INSERT INTO valid_seasons (seasons) VALUES
("WINTER"), ("SPRING"), ("SUMMER"), ("AUTUMN");
and then like
(deftable season
(!dao-def)
(!foreign 'valid-seasons 'id 'season))
I would like the class my-type to have the symbols of the seasons (winter,
spring, etc) stored in its slot when I am in the land of lisp and not to be
forced to store integer numbers, which should only be used in the land of
the database. What is the normal way to achieve that in postmodern?
-- PostgreSQL offers an enum type, so I tried using it in postmodern
(:create-enum 'seasondbtype (list "WINTER" "SPRING" "SUMMER" "AUTUMN"))
(defclass my-type ()
((id :initarg :id :col-type bigint)
(season :initarg :season :col-type seasondbtype))
(:metaclass dao-class)
(:keys id))
But then again I have to store strings inside my-type.season, not symbols.
I have added something like
(defmethod initialize-instance :after ((object my-type) &key)
(dolist (slot-name '(season))
(setf (slot-value object slot-name) (symbol-name (slot-value object
slot-name))))),
so that I can call make-instance with a symbol of season-type as an
argument. But this is only for storing objects to the database, I have not
gotten around to retrieving yet, and I think initialize-instance will be
called there as well, so I will have to fix it.
-- CL-SQL offers two slot options called :db-reader :db-writer where you
can specify functions which "take one argument, the value from the
database, and return the value that should be put into the slot" and "take
one argument, the value of the slot, and return the value that should be
put into the database" respectively. Is there something similar in
postmodern? Does the macro with-column-writers or the parameter
*custom-column-writers* have anything to do with that? If yes, can I have
an example of usage? I think that might solve my problem.
In short, in what way do postmodern's users deal with enumerated types, and
in particular how do they manage to store symbols in CLOS instances and the
corresponding strings (or even numbers) in PostgreSQL?
Regards,
Christos Gitsis