I have created a Resource that I wanted to store with CubDB as the datalayer.
However, I run into the following error message:
AshCubDB.DataLayer
does not support update
actions on this resource.
If I remove the update: :*
from the resource’s default action, I get the following error instead:
AshCubDB.DataLayer
does not support create
actions on this resource.
Resource
I created a simple key-value store as an example Resource
defmodule MyApp.Kve do
use Ash.Resource,
domain: MyApp,
data_layer: AshCubDB.DataLayer
attributes do
attribute :key, :string
attribute :value, :string
end
actions do
defaults [:read, :destroy, create: :*, update: :*]
end
cubdb do
directory "/data/cubdb/kv.cubdb"
auto_compact? true
auto_file_sync? true
name :kv_storage
end
end
Turning key
into a primary_key does not change anything.
Versions
From mix.lock
"ash_cubdb": {:hex, :ash_cubdb, "0.6.2", "828203fcc1a48cf5538a7d5ef0dfa353725859da90619dee8360975785adc6f2", ...
"ash": {:hex, :ash, "3.2.4", "81842a319aa18e974c9e87905c2a30b42e5084f10bf2931a6709e26398eeb5a6", ...
@jimsynz would be able to say more, as this is his package, but it looks like the can?
function for the data layer checks the writability of the target directory:
def can?(resource, :create), do: Dir.writable?(resource)
def can?(resource, :update), do: Dir.writable?(resource)
def can?(resource, :upsert), do: Dir.writable?(resource)
def can?(resource, :destroy), do: Dir.writable?(resource)
def can?(resource, :read), do: Dir.readable?(resource)
Ash checks can?/2
at compile time (which it didn’t always do, so that is likely why ash_cubdb
does this).
I’ve made a branch on my own fork with this fixed:
{:ash_cubdb, github: "zachdaniel/ash_cub_db", branch: "dont-check-dir"}
You could use this temporarily and then open an issue on the repo for ash_cubdb
.
1 Like
I see, the directory did not exist yet, so the checks probably failed. Did not expect this during compile time, as with mounted volumes etc the folders probably dont even exist in most build contexts.
Thanks!
Yeah, it doesn’t make sense to happen at compile time, but at some point in the past that can?
wasn’t called at compile time. The can?/2
shouldn’t use context related things (like file existence or environment variables).
Oh dear. I didn’t realise that can?/2
is now being called at compile time. I guess they should all just return true then.
Not your fault, it was changed in core at some point, and I didn’t anticipate the other kind of usage.