From 662feab8819784aa9cfc32d3b01c5870ed04b244 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 4 Sep 2025 07:10:13 -0400 Subject: [PATCH] Basic relay functionality completed --- .gitignore | 1 + db/c_nostr_relay.db | Bin 53248 -> 49152 bytes db/c_nostr_relay.db-shm | Bin 32768 -> 32768 bytes db/c_nostr_relay.db-wal | Bin 90672 -> 1165992 bytes db/init.sh | 2 +- db/schema.sql | 116 +++++--- docs/advanced_schema_design.md | 337 ++++++++++++++++++++++ docs/final_schema_recommendation.md | 416 ++++++++++++++++++++++++++++ docs/implementation_plan.md | 326 ++++++++++++++++++++++ docs/subscription_query_analysis.md | 331 ++++++++++++++++++++++ relay.log | 229 +++++++++++++++ relay.pid | 2 +- src/main | Bin 202976 -> 217776 bytes src/main.c | 378 ++++++++++++++++++------- tests/1_nip_test.sh | 279 +++++++++++++++---- 15 files changed, 2207 insertions(+), 210 deletions(-) create mode 100644 docs/advanced_schema_design.md create mode 100644 docs/final_schema_recommendation.md create mode 100644 docs/implementation_plan.md create mode 100644 docs/subscription_query_analysis.md diff --git a/.gitignore b/.gitignore index 45376a1..023bb8d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ nostr_core_lib/ +nips/ diff --git a/db/c_nostr_relay.db b/db/c_nostr_relay.db index caf0336a79cb0b444e40ed91e9688a855733e4de..39f1bb4c4b069b3b7e349327298a066f0d9b69be 100644 GIT binary patch literal 49152 zcmeI*+i%lW90zcx2~A>J%qF2I>L#74LW$RwwV(pkKrFPTq-$N4q!fgZmQ%CQsDzz@og1Kz;t>EB`KAay*?$|CE|f>iw74VJr}U00jO+f%~IMa_CAn z^+noqta_a~4b!eQso~I#rdg%tDqE+U)b?EQbEc#fDjKPjigR;XiS$e@6SfqtRaly$ zUe-z#vZNCc!auZfUDJuKt(@`q8Q#tYC6`Gql5I}Ds?8O3KlQA(ps`%9m6jHRAfywe zq>+vG>OH!{-p=C%8zO&wmfW-KT5!l;-8=A_jQz5+_gXbFETUSq4`fZBy|0`|4qeWs z9+U&EYLl9Fd&8g`4Z2Ppv-vu#UWrAK{;}0wo_}9zf1SesLbJfCykolJ`?dHZv&TehxR5DJ^ou8OceUaUr!Q`otk<^3Bn-<*?@mjy+*#;vOU%{ zRX>TjSvP_mhBz+LFBbKD)uEtqAbBd6OWj}Lb$4i$l_hBZeH+pG?>i6?uxevLKOQ4tX~+ETI~K{49Tk<{ zS2#AB*f(HiQ*=w!H>haF-FI-*FNaO&?`%T7&VMV)DAva3J#X{*e`AEAhT4B>{wy8L#FI9-X zys#h+v^Q!&)3Ax6qVY+klYkZRT48yi(xV@$vO0CVKT{luNo7$;ie)EuG9vXJfl@Kb=+E4qD9+lZU}43Ln#zg9;b*S?v~^4-QHh&TM({e$i^` zr>SH{W4WB}kxSSXBCqscZ?HuxpA8lf5zw6Grk1cdGPQl4r1+?9QRPO8vcZ2opwfi0t(F z78CuM(QJ%%=MwgeW4+?@B$3E`Q!U5)Gw)|(>)qi*e-R{!UIBwM+TQsy=w<4cpU0A! zY&Q1wZGXgyDB@>d5Ub*kQ?V}?qU@aZ$_VA>yXZ1LPV^R=`^AhxinAo&pxcD)vFy6) zkMy8WeyGlP9gD_b>nzNT_G;6r5tj`ib)spZHBWk+c0Z2hq^AGXmhG6CcWWLP$UZ;`wCgt3nyR4d#Fn(HguJ)6g zj$`ilJtcBQ(cKVxu@1h_Q2pR54R$T!(5AV=epacqNo%4b$?9ldf96WI*Yq#Cy)h|X z`MrILUug52`k3;)#J;dV00Izz00bZa0SG_<0uX=z1R(JL6u1(ThlUgBq0>WeCHO=7 z$+PG9i+CPY{HE`h;1LYp*?BO+*V#jkJ9iro?O$b9ubA>oVqaJw009U<00Izz00bZa z0SG_<0uVS%0&;vP9Xu@%_y12N<>_InAnF1E2tWV=5P$##AOHafKmY;|IO+m}@nQew zU;G;ZasU5PQeGZ)7t|jD5P$##AOHafKmY;|fB*y_a5x3x@pM|;|Fh5MdvQ4Hh+07a z0uX=z1Rwwb2tWV=5P$##jti&kuEtQ8@@e00Izz00bZa0SG_<0uX?}Q4~le($U}lKbDloN09+_ zh5!U0009U<00Izz00bZa0SFvIfwvRv{|emy{{xEO|38tGCx@`Us1gJq009U<00Izz z00bZa0SG|gs0y4&45uT{00x;uT=_~;{!qSUFIXS|0SG_<0uX=z1Rwwb2tWV=5O`w( z@5B?s!-=XxO^?=M(5AUV+-ifan`F!K8f3n_q!Z7qyFAj#SYk*?Y*NQ%QO@!`{P+KH z<&mU3QhrmOy|D@+Fa#g~0SG_<0uX=z1Rwwb2tWV=|GL15_;4(Inh;mwBeBTigFgQG Jf5Ah5KLMMp1cd+q literal 53248 zcmeI*!Ef4D9Kdm#rX~a6E7V zv9CSQG8yfO5SpfClJGR%XL{&Ui;?4_t<^Er>G^2ZecG@?5mC+yxp_U&vClf9c`QGtjYcIbT(Rx$iso<sc`hhsA zi}KjLbjPlL;ZCB$J(*j@3{gHNs*Kr@7ow_{-My>5ir8^?g`0)6z)fan?+OA z)n$yFvAmGL9Zyv2+wM%rhSgrr3%sH4^cBrq%kuNK96|ENJ^w1Yo@d7``{=MKzO!G- zQDupi{mgFJ&6?eg7*wHbb9zz_$7QYBu2t)H*gtiocP_2E(d5`zktwN?1P{xs?uKE0W9q*o%~xOk{S`qIjmS0$ot&}S z_YCuqsSoB7%x*g=*;o;LzETo6Dz)B?^sH%``X7(gyi{GJzB02&(cDx;AI#2^*3pY< z>t#6RmWJ_)nfcniSs1d>1>8M{WSEobdEdJbax{qH(m@w?>;ilimkamCIl4etmGTe-O35 z82Ul@aJuV(_P%{wxg5y%iinSfe*bM0Y~o!l23q}4jP6iY_MKolb{C;6D`S}7n!2V& z&E%)PT-kS}=ujPZRZn*xsbBZxD|Rz{&8h|dgY;gwWJUl11Q0*~0R#|0009ILKmdVH zFOUyYu>Sw_&}2XW0R#|0009ILKmY**5I`VB0oMO1;*%Ny1Q0*~0R#|0009ILKmdU? z39$ZO6EtZMKmY**5I_I{1Q0*~0R#|8QGoS-iuj~P009ILKmY**5I_I{1Q0-AO#-a{ z*91)(1Q0*~0R#|0009ILKmY**QWRkQpCUe~5kLR|1Q0*~0R#|0009ILSd#$%|8Gsu zq(J}y1Q0*~0R#|0009ILKp;f{{{EjLKB*Bv009ILKmY**5I_I{1Q1x00PFuXL6Zgn z1Q0*~0R#|0009ILKmdUh1z7*5h)-$+5I_I{1Q0*~0R#|0009KnB*6NAP0*x4009IL TKmY**5I_I{1Q0+VMS=eT9^EH+ diff --git a/db/c_nostr_relay.db-shm b/db/c_nostr_relay.db-shm index c58baa3b3366d79ad5a53ff4330799ff63ba45e2..38493fc2db73ecc0ca0198ee4fc235b0b0bdfbc5 100644 GIT binary patch literal 32768 zcmeI*XK++i7{>AcNlzf80tu)z3m~DXG*OWzM2tx9B2`cUX;KA2T4>S)i3*Y^gbre% z3rO$P0!Wiy6hssd;oM;u`4pEKhGFh~&dj@WXZP&ceSi14JNsqN#vM+;84uYq5Si27 zMA+lxnz5&n(|aZ5Pb_k^;E|NhrP9x&?ug%?7I%m9owc3etb6^oar55)ZvE_`zpVgU zfwqEd1=|X-6>2NYmgcz6$Hu~^^BQjFWwG^t8M&8p?#K6ZH~aVX+&Hi4d}jDM|CXEc z9AD0-uj~470uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCTP0fj%7L0wK;1 z%rzw7F#%(DRf*vN9-%NLDMwXm(2y3qMOXTAoIeQFmEo~Wc&A-IG7-yzJW3Ht@jQvt zq!BG?$2+{oP{#5JUoe-2tYjm**v|}qpQL@F>z_9{$wVr-Sz7+ic*^Lyhtq? z(~9BsAe?OEB0t3_Lj|f)nzj8$U!~|@f6SU0@bNcGv1&xy&1$PCX&ib zzGgY=*v`)!;T%^8G?6A=>Gw`dT-s?U(d6V|5-7oQRN)mG(405v!n+J+G%2Jpi*NXj z_3U6Tzw#Sb2{KV8htluTOsFjhNI(J-kbrvyhA^9d+}oZylRyRn$&BG+K4%W!vVsll zWFJTQoofW^dwm9OddLj|=lPdt$d4YJ-NhPO(|4x^WSy*T8t=lCw`|@qK&&&58 zBUL@nC@=t-`yUBFg(ueQ8gc{KJU|SxmJ^7%fEcgX=8r7AcAHp**f$&cA7+}wYR$+5 z6#C1=$PA%aAQUTvVuMiZV2YIkXpIn%`ICv2lYx&x7{cUY;AaqlFu5577(^jV9tJ@M JF(6Y^5&#`oQM>>E diff --git a/db/c_nostr_relay.db-wal b/db/c_nostr_relay.db-wal index b1cb61c9701b4f94b2d5b9738f159bebbb9501b1..8e0cb896bde284e15f9c0f7069b4663027f5c28d 100644 GIT binary patch literal 1165992 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 H8R7pA4QNxR literal 90672 zcmeI*Z)jC@9LMo<@41`aZPzm~MHtcM($NF!{JZCz>qx;I85N|BDTUhkcWG{OV}A;t zEViN%Qc*!v_8^0j=us_1lzKFa2up|-VSmUFQVIhVwG{iE9q-r-O}p2w8}A>Ndw0*} zo^!shb02;8`+bi6ROPU={K#TSs+FSgsngv4@!-BiE0;8XS2OlKmY**5I_I{1Q0*~0R#}3X#&H`5>-Q)p-d`$_i)BC96e{-zMl;> zHE;q?x5Iqkg??ZKMo!nWu5B2$r8;?6HFH@bXM}mfGs3Lnn6B&Fu50Ff$Fj2dtd+Au z!w5V()ZDDChlZ!-vz`%HTGlaa@y4+9!1pxYQ7y+)bB=F&=Hq*RJi0dQ?Ch@3_jY&H z-?Myu*y(Ps?+^R>8*-W!`l{{+j_x?B?RbH&=lq;Fu4VXn&lfumeBU)yTeqF8s+)RX zn!cIUR9n+k&o@=g)vZ9(C%&!Op(s^%&AT|4_1k731z<|9t;E!KmY**5I_I{1Q0*~0R#}Z`2^Oa zhBE15dmf^!R8(4_FED6!E#5xz&~x+!ZoUi786kiG0tg_000IagfB*srATUK>qAyVF zTn4efifEsOzQC!fmg>IOPL9TXfwPiwcFGa?69EJeKmY**5I_I{1Q0*~0R(1+z#KW1 zj@CDbVk)D83Vnf*i?96k$kXp8;=aInNjX0&%B2Vd5I_I{1Q0*~0R#|0009ILxJ*En z(`m73PPDnu7g$lT?7*G7H?E5N0(&H7&t+fYEdmH2fB*srAb8HTn_7(5f0?*Xp|V>N4+a7VAbRAQgN2fxZE6Yv}j4id!Vsw>%MU>lbB3Qv)XZ0=t$5^SgKUJ|E8);68=rz3dzv z0R#|0009ILKmY**5I_KdD+-kAK84lM5en-Fs*j#}`=<{+X^i^iK=bq$4Xz_fJ)QIx=B?%+qOo;mSF#ku?AzQCxYj85MR z?+`!$0R#|0009ILKmY**5I~@;0uP9r5!9tilr$hJnU*{FW%HpIzFNJjJ8Bjrm31O_ zP&_dZKmY**5I_I{1Q0*~0R#|0;MxRQlOiEdX(~D)FzgrEfLp>S8*oc|@W15_u3X!` z^R1eLUD14jq%t5W`^6Ij0R#|0009ILKmY**5I_I{1WG5+k{Ze+iv5Rw@`mINx&s^D zS+Oy9B<>5GkdzZ750>u2vnK=)KmY**5I_I{1Q0*~0R+k_P$4UcFnN{S!5^Lt_HI4& zUNY_rj7!Qm$%AFRVjLU+1Q0*~0R#|0009ILKmdX37Fdu{niA7jA|$UZckuh(!v}tU za!`r;0v(dlLGs{r^YaA+5I_I{1Q0*~0R#|0009L4DR8gI3sj0;J`g5vXzt*_ecx4&6_)3t&Qdj$jV(4xr5?`fdB#sAb`4= 1000 AND kind < 10000) OR + (kind >= 4 AND kind < 45) OR + kind = 1 OR kind = 2 + ) +); + +-- Replaceable Events (latest per pubkey+kind) +CREATE TABLE events_replaceable ( + pubkey TEXT NOT NULL, + kind INTEGER NOT NULL, + id TEXT NOT NULL, + created_at INTEGER NOT NULL, + content TEXT NOT NULL, + sig TEXT NOT NULL, + tags JSON, + replaced_at INTEGER DEFAULT (strftime('%s', 'now')), + PRIMARY KEY (pubkey, kind), + CONSTRAINT kind_replaceable CHECK ( + (kind >= 10000 AND kind < 20000) OR + kind = 0 OR kind = 3 + ) +); + +-- Ephemeral Events (temporary/optional storage) +CREATE TABLE events_ephemeral ( + id TEXT PRIMARY KEY, + pubkey TEXT NOT NULL, + created_at INTEGER NOT NULL, + kind INTEGER NOT NULL, + content TEXT NOT NULL, + sig TEXT NOT NULL, + tags JSON, + expires_at INTEGER DEFAULT (strftime('%s', 'now', '+1 hour')), + CONSTRAINT kind_ephemeral CHECK ( + kind >= 20000 AND kind < 30000 + ) +); + +-- Addressable Events (latest per pubkey+kind+d_tag) +CREATE TABLE events_addressable ( + pubkey TEXT NOT NULL, + kind INTEGER NOT NULL, + d_tag TEXT NOT NULL, + id TEXT NOT NULL, + created_at INTEGER NOT NULL, + content TEXT NOT NULL, + sig TEXT NOT NULL, + tags JSON, + replaced_at INTEGER DEFAULT (strftime('%s', 'now')), + PRIMARY KEY (pubkey, kind, d_tag), + CONSTRAINT kind_addressable CHECK ( + kind >= 30000 AND kind < 40000 + ) +); +``` + +### Indexes for Performance + +```sql +-- Regular events indexes +CREATE INDEX idx_regular_pubkey ON events_regular(pubkey); +CREATE INDEX idx_regular_kind ON events_regular(kind); +CREATE INDEX idx_regular_created_at ON events_regular(created_at); +CREATE INDEX idx_regular_kind_created_at ON events_regular(kind, created_at); + +-- Replaceable events indexes +CREATE INDEX idx_replaceable_created_at ON events_replaceable(created_at); +CREATE INDEX idx_replaceable_id ON events_replaceable(id); + +-- Ephemeral events indexes +CREATE INDEX idx_ephemeral_expires_at ON events_ephemeral(expires_at); +CREATE INDEX idx_ephemeral_pubkey ON events_ephemeral(pubkey); + +-- Addressable events indexes +CREATE INDEX idx_addressable_created_at ON events_addressable(created_at); +CREATE INDEX idx_addressable_id ON events_addressable(id); + +-- JSON tag indexes (examples) +CREATE INDEX idx_regular_e_tags ON events_regular( + json_extract(tags, '$[*][1]') +) WHERE json_extract(tags, '$[*][0]') = 'e'; + +CREATE INDEX idx_regular_p_tags ON events_regular( + json_extract(tags, '$[*][1]') +) WHERE json_extract(tags, '$[*][0]') = 'p'; +``` + +### Option 2: Unified Tag Table Approach + +```sql +-- Unified tag storage (alternative to JSON) +CREATE TABLE tags_unified ( + event_id TEXT NOT NULL, + event_type TEXT NOT NULL, -- 'regular', 'replaceable', 'ephemeral', 'addressable' + tag_index INTEGER NOT NULL, -- Position in tag array + name TEXT NOT NULL, + value TEXT NOT NULL, + param_2 TEXT, -- Third element if present + param_3 TEXT, -- Fourth element if present + param_json TEXT, -- JSON for additional parameters + PRIMARY KEY (event_id, tag_index) +); + +CREATE INDEX idx_tags_name_value ON tags_unified(name, value); +CREATE INDEX idx_tags_event_type ON tags_unified(event_type); +``` + +## Implementation Strategy + +### 1. Kind Classification Function (C Code) +```c +typedef enum { + EVENT_TYPE_REGULAR, + EVENT_TYPE_REPLACEABLE, + EVENT_TYPE_EPHEMERAL, + EVENT_TYPE_ADDRESSABLE, + EVENT_TYPE_INVALID +} event_type_t; + +event_type_t classify_event_kind(int kind) { + if ((kind >= 1000 && kind < 10000) || + (kind >= 4 && kind < 45) || + kind == 1 || kind == 2) { + return EVENT_TYPE_REGULAR; + } + + if ((kind >= 10000 && kind < 20000) || + kind == 0 || kind == 3) { + return EVENT_TYPE_REPLACEABLE; + } + + if (kind >= 20000 && kind < 30000) { + return EVENT_TYPE_EPHEMERAL; + } + + if (kind >= 30000 && kind < 40000) { + return EVENT_TYPE_ADDRESSABLE; + } + + return EVENT_TYPE_INVALID; +} +``` + +### 2. Replacement Logic for Replaceable Events +```sql +-- Trigger for replaceable events +CREATE TRIGGER replace_event_on_insert +BEFORE INSERT ON events_replaceable +FOR EACH ROW +WHEN EXISTS ( + SELECT 1 FROM events_replaceable + WHERE pubkey = NEW.pubkey AND kind = NEW.kind +) +BEGIN + DELETE FROM events_replaceable + WHERE pubkey = NEW.pubkey + AND kind = NEW.kind + AND ( + created_at < NEW.created_at OR + (created_at = NEW.created_at AND id > NEW.id) + ); +END; +``` + +### 3. D-Tag Extraction for Addressable Events +```c +char* extract_d_tag(cJSON* tags) { + if (!tags || !cJSON_IsArray(tags)) { + return NULL; + } + + cJSON* tag; + cJSON_ArrayForEach(tag, tags) { + if (cJSON_IsArray(tag) && cJSON_GetArraySize(tag) >= 2) { + cJSON* tag_name = cJSON_GetArrayItem(tag, 0); + cJSON* tag_value = cJSON_GetArrayItem(tag, 1); + + if (cJSON_IsString(tag_name) && cJSON_IsString(tag_value)) { + if (strcmp(cJSON_GetStringValue(tag_name), "d") == 0) { + return strdup(cJSON_GetStringValue(tag_value)); + } + } + } + } + + return strdup(""); // Default empty d-tag +} +``` + +## Advantages of This Design + +### 1. Protocol Compliance +- **Enforced at DB level**: Schema constraints prevent invalid event storage +- **Automatic replacement**: Triggers handle replaceable/addressable event logic +- **Type safety**: Separate tables ensure correct handling per event type + +### 2. Performance Benefits +- **Targeted indexes**: Each table optimized for its access patterns +- **Reduced storage**: Ephemeral events can be auto-expired +- **Query optimization**: SQLite can optimize queries per table structure + +### 3. JSON Tag Benefits +- **Atomic storage**: Tags stored with their event +- **Rich querying**: SQLite JSON functions enable complex tag queries +- **Schema flexibility**: Can handle arbitrary tag structures +- **Functional indexes**: Index specific tag patterns efficiently + +## Migration Strategy + +1. **Phase 1**: Create new schema alongside existing +2. **Phase 2**: Implement kind classification and routing logic +3. **Phase 3**: Migrate existing data to appropriate tables +4. **Phase 4**: Update application logic to use new tables +5. **Phase 5**: Drop old schema after verification + +## Next Steps for Implementation + +1. **Prototype JSON performance**: Create test database with sample data +2. **Benchmark query patterns**: Compare JSON vs normalized approaches +3. **Implement kind classification**: Add routing logic to C code +4. **Create migration scripts**: Handle existing data transformation +5. **Update test suite**: Verify compliance with new schema \ No newline at end of file diff --git a/docs/final_schema_recommendation.md b/docs/final_schema_recommendation.md new file mode 100644 index 0000000..75d6452 --- /dev/null +++ b/docs/final_schema_recommendation.md @@ -0,0 +1,416 @@ +# Final Schema Recommendation: Hybrid Single Table Approach + +## Executive Summary + +After analyzing the subscription query complexity, **the multi-table approach creates more problems than it solves**. REQ filters don't align with storage semantics - clients filter by kind, author, and tags regardless of event type classification. + +**Recommendation: Modified Single Table with Event Type Classification** + +## The Multi-Table Problem + +### REQ Filter Reality Check +- Clients send: `{"kinds": [1, 0, 30023], "authors": ["pubkey"], "#p": ["target"]}` +- Multi-table requires: 3 separate queries + UNION + complex ordering +- Single table requires: 1 query with simple WHERE conditions + +### Query Complexity Explosion +```sql +-- Multi-table nightmare for simple filter +WITH results AS ( + SELECT * FROM events_regular WHERE kind = 1 AND pubkey = ? + UNION ALL + SELECT * FROM events_replaceable WHERE kind = 0 AND pubkey = ? + UNION ALL + SELECT * FROM events_addressable WHERE kind = 30023 AND pubkey = ? +) +SELECT r.* FROM results r +JOIN multiple_tag_tables t ON complex_conditions +ORDER BY created_at DESC, id ASC LIMIT ?; + +-- vs Single table simplicity +SELECT e.* FROM events e, json_each(e.tags) t +WHERE e.kind IN (1, 0, 30023) + AND e.pubkey = ? + AND json_extract(t.value, '$[0]') = 'p' + AND json_extract(t.value, '$[1]') = ? +ORDER BY e.created_at DESC, e.id ASC LIMIT ?; +``` + +## Recommended Schema: Hybrid Approach + +### Core Design Philosophy +- **Single table for REQ query simplicity** +- **Event type classification for protocol compliance** +- **JSON tags for atomic storage and rich querying** +- **Partial unique constraints for replacement logic** + +### Schema Definition + +```sql +CREATE TABLE events ( + id TEXT PRIMARY KEY, + pubkey TEXT NOT NULL, + created_at INTEGER NOT NULL, + kind INTEGER NOT NULL, + event_type TEXT NOT NULL CHECK (event_type IN ('regular', 'replaceable', 'ephemeral', 'addressable')), + content TEXT NOT NULL, + sig TEXT NOT NULL, + tags JSON NOT NULL DEFAULT '[]', + first_seen INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), + + -- Additional fields for addressable events + d_tag TEXT GENERATED ALWAYS AS ( + CASE + WHEN event_type = 'addressable' THEN + json_extract(tags, '$[*][1]') + FROM json_each(tags) + WHERE json_extract(value, '$[0]') = 'd' + LIMIT 1 + ELSE NULL + END + ) STORED, + + -- Replacement tracking + replaced_at INTEGER, + + -- Protocol compliance constraints + CONSTRAINT unique_replaceable + UNIQUE (pubkey, kind) + WHERE event_type = 'replaceable', + + CONSTRAINT unique_addressable + UNIQUE (pubkey, kind, d_tag) + WHERE event_type = 'addressable' AND d_tag IS NOT NULL +); +``` + +### Event Type Classification Function + +```sql +-- Function to determine event type from kind +CREATE VIEW event_type_lookup AS +SELECT + CASE + WHEN (kind >= 1000 AND kind < 10000) OR + (kind >= 4 AND kind < 45) OR + kind = 1 OR kind = 2 THEN 'regular' + WHEN (kind >= 10000 AND kind < 20000) OR + kind = 0 OR kind = 3 THEN 'replaceable' + WHEN kind >= 20000 AND kind < 30000 THEN 'ephemeral' + WHEN kind >= 30000 AND kind < 40000 THEN 'addressable' + ELSE 'unknown' + END as event_type, + kind +FROM ( + -- Generate all possible kind values for lookup + WITH RECURSIVE kinds(kind) AS ( + SELECT 0 + UNION ALL + SELECT kind + 1 FROM kinds WHERE kind < 65535 + ) + SELECT kind FROM kinds +); +``` + +### Performance Indexes + +```sql +-- Core query patterns +CREATE INDEX idx_events_pubkey ON events(pubkey); +CREATE INDEX idx_events_kind ON events(kind); +CREATE INDEX idx_events_created_at ON events(created_at DESC); +CREATE INDEX idx_events_event_type ON events(event_type); + +-- Composite indexes for common filters +CREATE INDEX idx_events_pubkey_created_at ON events(pubkey, created_at DESC); +CREATE INDEX idx_events_kind_created_at ON events(kind, created_at DESC); +CREATE INDEX idx_events_type_created_at ON events(event_type, created_at DESC); + +-- JSON tag indexes for common patterns +CREATE INDEX idx_events_e_tags ON events( + json_extract(tags, '$[*][1]') +) WHERE json_extract(tags, '$[*][0]') = 'e'; + +CREATE INDEX idx_events_p_tags ON events( + json_extract(tags, '$[*][1]') +) WHERE json_extract(tags, '$[*][0]') = 'p'; + +CREATE INDEX idx_events_hashtags ON events( + json_extract(tags, '$[*][1]') +) WHERE json_extract(tags, '$[*][0]') = 't'; + +-- Addressable events d_tag index +CREATE INDEX idx_events_d_tag ON events(d_tag) +WHERE event_type = 'addressable' AND d_tag IS NOT NULL; +``` + +### Replacement Logic Implementation + +#### Replaceable Events Trigger +```sql +CREATE TRIGGER handle_replaceable_events +BEFORE INSERT ON events +FOR EACH ROW +WHEN NEW.event_type = 'replaceable' +BEGIN + -- Delete older replaceable events with same pubkey+kind + DELETE FROM events + WHERE event_type = 'replaceable' + AND pubkey = NEW.pubkey + AND kind = NEW.kind + AND ( + created_at < NEW.created_at OR + (created_at = NEW.created_at AND id > NEW.id) + ); +END; +``` + +#### Addressable Events Trigger +```sql +CREATE TRIGGER handle_addressable_events +BEFORE INSERT ON events +FOR EACH ROW +WHEN NEW.event_type = 'addressable' +BEGIN + -- Delete older addressable events with same pubkey+kind+d_tag + DELETE FROM events + WHERE event_type = 'addressable' + AND pubkey = NEW.pubkey + AND kind = NEW.kind + AND d_tag = NEW.d_tag + AND ( + created_at < NEW.created_at OR + (created_at = NEW.created_at AND id > NEW.id) + ); +END; +``` + +## Implementation Strategy + +### C Code Integration + +#### Event Type Classification +```c +typedef enum { + EVENT_TYPE_REGULAR, + EVENT_TYPE_REPLACEABLE, + EVENT_TYPE_EPHEMERAL, + EVENT_TYPE_ADDRESSABLE, + EVENT_TYPE_UNKNOWN +} event_type_t; + +event_type_t classify_event_kind(int kind) { + if ((kind >= 1000 && kind < 10000) || + (kind >= 4 && kind < 45) || + kind == 1 || kind == 2) { + return EVENT_TYPE_REGULAR; + } + if ((kind >= 10000 && kind < 20000) || + kind == 0 || kind == 3) { + return EVENT_TYPE_REPLACEABLE; + } + if (kind >= 20000 && kind < 30000) { + return EVENT_TYPE_EPHEMERAL; + } + if (kind >= 30000 && kind < 40000) { + return EVENT_TYPE_ADDRESSABLE; + } + return EVENT_TYPE_UNKNOWN; +} + +const char* event_type_to_string(event_type_t type) { + switch (type) { + case EVENT_TYPE_REGULAR: return "regular"; + case EVENT_TYPE_REPLACEABLE: return "replaceable"; + case EVENT_TYPE_EPHEMERAL: return "ephemeral"; + case EVENT_TYPE_ADDRESSABLE: return "addressable"; + default: return "unknown"; + } +} +``` + +#### Simplified Event Storage +```c +int store_event(cJSON* event) { + // Extract fields + cJSON* id = cJSON_GetObjectItem(event, "id"); + cJSON* pubkey = cJSON_GetObjectItem(event, "pubkey"); + cJSON* created_at = cJSON_GetObjectItem(event, "created_at"); + cJSON* kind = cJSON_GetObjectItem(event, "kind"); + cJSON* content = cJSON_GetObjectItem(event, "content"); + cJSON* sig = cJSON_GetObjectItem(event, "sig"); + + // Classify event type + event_type_t type = classify_event_kind(cJSON_GetNumberValue(kind)); + + // Serialize tags to JSON + cJSON* tags = cJSON_GetObjectItem(event, "tags"); + char* tags_json = cJSON_Print(tags ? tags : cJSON_CreateArray()); + + // Single INSERT statement - database handles replacement via triggers + const char* sql = + "INSERT INTO events (id, pubkey, created_at, kind, event_type, content, sig, tags) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + + sqlite3_stmt* stmt; + int rc = sqlite3_prepare_v2(g_db, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + free(tags_json); + return -1; + } + + sqlite3_bind_text(stmt, 1, cJSON_GetStringValue(id), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 2, cJSON_GetStringValue(pubkey), -1, SQLITE_STATIC); + sqlite3_bind_int64(stmt, 3, (sqlite3_int64)cJSON_GetNumberValue(created_at)); + sqlite3_bind_int(stmt, 4, (int)cJSON_GetNumberValue(kind)); + sqlite3_bind_text(stmt, 5, event_type_to_string(type), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 6, cJSON_GetStringValue(content), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 7, cJSON_GetStringValue(sig), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 8, tags_json, -1, SQLITE_TRANSIENT); + + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + free(tags_json); + + return (rc == SQLITE_DONE) ? 0 : -1; +} +``` + +#### Simple REQ Query Building +```c +char* build_filter_query(cJSON* filter) { + // Build single query against events table + // Much simpler than multi-table approach + + GString* query = g_string_new("SELECT * FROM events WHERE 1=1"); + + // Handle ids filter + cJSON* ids = cJSON_GetObjectItem(filter, "ids"); + if (ids && cJSON_IsArray(ids)) { + g_string_append(query, " AND id IN ("); + // Add parameter placeholders + g_string_append(query, ")"); + } + + // Handle authors filter + cJSON* authors = cJSON_GetObjectItem(filter, "authors"); + if (authors && cJSON_IsArray(authors)) { + g_string_append(query, " AND pubkey IN ("); + // Add parameter placeholders + g_string_append(query, ")"); + } + + // Handle kinds filter + cJSON* kinds = cJSON_GetObjectItem(filter, "kinds"); + if (kinds && cJSON_IsArray(kinds)) { + g_string_append(query, " AND kind IN ("); + // Add parameter placeholders + g_string_append(query, ")"); + } + + // Handle tag filters (#e, #p, etc.) + cJSON* item; + cJSON_ArrayForEach(item, filter) { + char* key = item->string; + if (key && key[0] == '#' && strlen(key) == 2) { + char tag_name = key[1]; + g_string_append_printf(query, + " AND EXISTS (SELECT 1 FROM json_each(tags) " + "WHERE json_extract(value, '$[0]') = '%c' " + "AND json_extract(value, '$[1]') IN (", tag_name); + // Add parameter placeholders + g_string_append(query, "))"); + } + } + + // Handle time range + cJSON* since = cJSON_GetObjectItem(filter, "since"); + if (since) { + g_string_append(query, " AND created_at >= ?"); + } + + cJSON* until = cJSON_GetObjectItem(filter, "until"); + if (until) { + g_string_append(query, " AND created_at <= ?"); + } + + // Standard ordering and limit + g_string_append(query, " ORDER BY created_at DESC, id ASC"); + + cJSON* limit = cJSON_GetObjectItem(filter, "limit"); + if (limit) { + g_string_append(query, " LIMIT ?"); + } + + return g_string_free(query, FALSE); +} +``` + +## Benefits of This Approach + +### 1. Query Simplicity +- ✅ Single table = simple REQ queries +- ✅ No UNION complexity +- ✅ Familiar SQL patterns +- ✅ Easy LIMIT and ORDER BY handling + +### 2. Protocol Compliance +- ✅ Event type classification enforced +- ✅ Replacement logic via triggers +- ✅ Unique constraints prevent duplicates +- ✅ Proper handling of all event types + +### 3. Performance +- ✅ Unified indexes across all events +- ✅ No join overhead for basic queries +- ✅ JSON tag indexes for complex filters +- ✅ Single table scan for cross-kind queries + +### 4. Implementation Simplicity +- ✅ Minimal changes from current code +- ✅ Database handles replacement logic +- ✅ Simple event storage function +- ✅ No complex routing logic needed + +### 5. Future Flexibility +- ✅ Can add columns for new event types +- ✅ Can split tables later if needed +- ✅ Easy to add new indexes +- ✅ Extensible constraint system + +## Migration Path + +### Phase 1: Schema Update +1. Add `event_type` column to existing events table +2. Add JSON `tags` column +3. Create classification triggers +4. Add partial unique constraints + +### Phase 2: Data Migration +1. Classify existing events by kind +2. Convert existing tag table data to JSON +3. Verify constraint compliance +4. Update indexes + +### Phase 3: Code Updates +1. Update event storage to use new schema +2. Simplify REQ query building +3. Remove tag table JOIN logic +4. Test subscription filtering + +### Phase 4: Optimization +1. Monitor query performance +2. Add specialized indexes as needed +3. Tune replacement triggers +4. Consider ephemeral event cleanup + +## Conclusion + +This hybrid approach achieves the best of both worlds: + +- **Protocol compliance** through event type classification and constraints +- **Query simplicity** through unified storage +- **Performance** through targeted indexes +- **Implementation ease** through minimal complexity + +The multi-table approach, while theoretically cleaner, creates a subscription query nightmare that would significantly burden the implementation. The hybrid single-table approach provides all the benefits with manageable complexity. \ No newline at end of file diff --git a/docs/implementation_plan.md b/docs/implementation_plan.md new file mode 100644 index 0000000..2953f04 --- /dev/null +++ b/docs/implementation_plan.md @@ -0,0 +1,326 @@ +# Implementation Plan: Hybrid Schema Migration + +## Overview + +Migrating from the current two-table design (event + tag tables) to a single event table with JSON tags column and event type classification. + +## Current Schema → Target Schema + +### Current Schema (to be replaced) +```sql +CREATE TABLE event ( + id TEXT PRIMARY KEY, + pubkey TEXT NOT NULL, + created_at INTEGER NOT NULL, + kind INTEGER NOT NULL, + content TEXT NOT NULL, + sig TEXT NOT NULL +); + +CREATE TABLE tag ( + id TEXT NOT NULL, -- references event.id + name TEXT NOT NULL, + value TEXT NOT NULL, + parameters TEXT +); +``` + +### Target Schema (simplified from final recommendation) +```sql +CREATE TABLE events ( + id TEXT PRIMARY KEY, + pubkey TEXT NOT NULL, + created_at INTEGER NOT NULL, + kind INTEGER NOT NULL, + event_type TEXT NOT NULL CHECK (event_type IN ('regular', 'replaceable', 'ephemeral', 'addressable')), + content TEXT NOT NULL, + sig TEXT NOT NULL, + tags JSON NOT NULL DEFAULT '[]', + first_seen INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), + + -- Optional: Protocol compliance constraints (can be added later) + CONSTRAINT unique_replaceable + UNIQUE (pubkey, kind) WHERE event_type = 'replaceable', + CONSTRAINT unique_addressable + UNIQUE (pubkey, kind, json_extract(tags, '$[?(@[0]=="d")][1]')) + WHERE event_type = 'addressable' +); +``` + +## Implementation Steps + +### Phase 1: Update Schema File + +**File**: `db/schema.sql` + +1. Replace current event table definition +2. Remove tag table completely +3. Add new indexes for performance +4. Add event type classification logic + +### Phase 2: Update C Code + +**File**: `src/main.c` + +1. Add event type classification function +2. Update `store_event()` function to use JSON tags +3. Update `retrieve_event()` function to return JSON tags +4. Remove all tag table related code +5. Update REQ query handling to use JSON tag queries + +### Phase 3: Update Database Initialization + +**File**: `db/init.sh` + +1. Update table count validation (expect 1 table instead of 2) +2. Update schema verification logic + +### Phase 4: Update Tests + +**File**: `tests/1_nip_test.sh` + +1. Verify events are stored with JSON tags +2. Test query functionality with new schema +3. Validate event type classification + +### Phase 5: Migration Strategy + +Create migration script to handle existing data (if any). + +## Detailed Implementation + +### 1. Event Type Classification + +```c +// Add to src/main.c +typedef enum { + EVENT_TYPE_REGULAR, + EVENT_TYPE_REPLACEABLE, + EVENT_TYPE_EPHEMERAL, + EVENT_TYPE_ADDRESSABLE, + EVENT_TYPE_UNKNOWN +} event_type_t; + +event_type_t classify_event_kind(int kind) { + if ((kind >= 1000 && kind < 10000) || + (kind >= 4 && kind < 45) || + kind == 1 || kind == 2) { + return EVENT_TYPE_REGULAR; + } + if ((kind >= 10000 && kind < 20000) || + kind == 0 || kind == 3) { + return EVENT_TYPE_REPLACEABLE; + } + if (kind >= 20000 && kind < 30000) { + return EVENT_TYPE_EPHEMERAL; + } + if (kind >= 30000 && kind < 40000) { + return EVENT_TYPE_ADDRESSABLE; + } + return EVENT_TYPE_UNKNOWN; +} + +const char* event_type_to_string(event_type_t type) { + switch (type) { + case EVENT_TYPE_REGULAR: return "regular"; + case EVENT_TYPE_REPLACEABLE: return "replaceable"; + case EVENT_TYPE_EPHEMERAL: return "ephemeral"; + case EVENT_TYPE_ADDRESSABLE: return "addressable"; + default: return "unknown"; + } +} +``` + +### 2. Updated store_event Function + +```c +// Replace existing store_event function +int store_event(cJSON* event) { + if (!g_db || !event) { + return -1; + } + + // Extract event fields + cJSON* id = cJSON_GetObjectItem(event, "id"); + cJSON* pubkey = cJSON_GetObjectItem(event, "pubkey"); + cJSON* created_at = cJSON_GetObjectItem(event, "created_at"); + cJSON* kind = cJSON_GetObjectItem(event, "kind"); + cJSON* content = cJSON_GetObjectItem(event, "content"); + cJSON* sig = cJSON_GetObjectItem(event, "sig"); + cJSON* tags = cJSON_GetObjectItem(event, "tags"); + + if (!id || !pubkey || !created_at || !kind || !content || !sig) { + log_error("Invalid event - missing required fields"); + return -1; + } + + // Classify event type + event_type_t type = classify_event_kind((int)cJSON_GetNumberValue(kind)); + + // Serialize tags to JSON (use empty array if no tags) + char* tags_json = NULL; + if (tags && cJSON_IsArray(tags)) { + tags_json = cJSON_Print(tags); + } else { + tags_json = strdup("[]"); + } + + if (!tags_json) { + log_error("Failed to serialize tags to JSON"); + return -1; + } + + // Single INSERT statement + const char* sql = + "INSERT INTO events (id, pubkey, created_at, kind, event_type, content, sig, tags) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + + sqlite3_stmt* stmt; + int rc = sqlite3_prepare_v2(g_db, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + log_error("Failed to prepare event insert statement"); + free(tags_json); + return -1; + } + + // Bind parameters + sqlite3_bind_text(stmt, 1, cJSON_GetStringValue(id), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 2, cJSON_GetStringValue(pubkey), -1, SQLITE_STATIC); + sqlite3_bind_int64(stmt, 3, (sqlite3_int64)cJSON_GetNumberValue(created_at)); + sqlite3_bind_int(stmt, 4, (int)cJSON_GetNumberValue(kind)); + sqlite3_bind_text(stmt, 5, event_type_to_string(type), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 6, cJSON_GetStringValue(content), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 7, cJSON_GetStringValue(sig), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 8, tags_json, -1, SQLITE_TRANSIENT); + + // Execute statement + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + + if (rc != SQLITE_DONE) { + if (rc == SQLITE_CONSTRAINT) { + log_warning("Event already exists in database"); + free(tags_json); + return 0; // Not an error, just duplicate + } + char error_msg[256]; + snprintf(error_msg, sizeof(error_msg), "Failed to insert event: %s", sqlite3_errmsg(g_db)); + log_error(error_msg); + free(tags_json); + return -1; + } + + free(tags_json); + log_success("Event stored in database"); + return 0; +} +``` + +### 3. Updated retrieve_event Function + +```c +// Replace existing retrieve_event function +cJSON* retrieve_event(const char* event_id) { + if (!g_db || !event_id) { + return NULL; + } + + const char* sql = + "SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE id = ?"; + + sqlite3_stmt* stmt; + int rc = sqlite3_prepare_v2(g_db, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + return NULL; + } + + sqlite3_bind_text(stmt, 1, event_id, -1, SQLITE_STATIC); + + cJSON* event = NULL; + if (sqlite3_step(stmt) == SQLITE_ROW) { + event = cJSON_CreateObject(); + + cJSON_AddStringToObject(event, "id", (char*)sqlite3_column_text(stmt, 0)); + cJSON_AddStringToObject(event, "pubkey", (char*)sqlite3_column_text(stmt, 1)); + cJSON_AddNumberToObject(event, "created_at", sqlite3_column_int64(stmt, 2)); + cJSON_AddNumberToObject(event, "kind", sqlite3_column_int(stmt, 3)); + cJSON_AddStringToObject(event, "content", (char*)sqlite3_column_text(stmt, 4)); + cJSON_AddStringToObject(event, "sig", (char*)sqlite3_column_text(stmt, 5)); + + // Parse tags JSON + const char* tags_json = (char*)sqlite3_column_text(stmt, 6); + if (tags_json) { + cJSON* tags = cJSON_Parse(tags_json); + if (tags) { + cJSON_AddItemToObject(event, "tags", tags); + } else { + cJSON_AddItemToObject(event, "tags", cJSON_CreateArray()); + } + } else { + cJSON_AddItemToObject(event, "tags", cJSON_CreateArray()); + } + } + + sqlite3_finalize(stmt); + return event; +} +``` + +## Migration Considerations + +### Handling Existing Data + +If there's existing data in the current schema: + +1. **Export existing events and tags** +2. **Transform tag data to JSON format** +3. **Classify events by kind** +4. **Import into new schema** + +### Backward Compatibility + +- API remains the same - events still have the same JSON structure +- Internal storage changes but external interface is unchanged +- Tests should pass with minimal modifications + +## Performance Optimizations + +### Essential Indexes + +```sql +-- Core performance indexes +CREATE INDEX idx_events_pubkey ON events(pubkey); +CREATE INDEX idx_events_kind ON events(kind); +CREATE INDEX idx_events_created_at ON events(created_at DESC); +CREATE INDEX idx_events_event_type ON events(event_type); + +-- Composite indexes for common query patterns +CREATE INDEX idx_events_kind_created_at ON events(kind, created_at DESC); +CREATE INDEX idx_events_pubkey_created_at ON events(pubkey, created_at DESC); + +-- JSON tag indexes for common tag patterns +CREATE INDEX idx_events_e_tags ON events( + json_extract(tags, '$[*][1]') +) WHERE json_extract(tags, '$[*][0]') = 'e'; + +CREATE INDEX idx_events_p_tags ON events( + json_extract(tags, '$[*][1]') +) WHERE json_extract(tags, '$[*][0]') = 'p'; +``` + +## Next Steps + +1. **Switch to code mode** to implement the schema changes +2. **Update db/schema.sql** with new table definition +3. **Modify src/main.c** with new functions +4. **Update db/init.sh** for single table validation +5. **Test with existing test suite** + +This approach will provide: +- ✅ Simplified schema management +- ✅ Protocol compliance preparation +- ✅ JSON tag query capabilities +- ✅ Performance optimization opportunities +- ✅ Easy REQ subscription handling + +Ready to proceed with implementation? \ No newline at end of file diff --git a/docs/subscription_query_analysis.md b/docs/subscription_query_analysis.md new file mode 100644 index 0000000..3a43db5 --- /dev/null +++ b/docs/subscription_query_analysis.md @@ -0,0 +1,331 @@ +# Subscription Query Complexity Analysis + +## Overview + +This document analyzes how Nostr REQ subscription filters would be implemented across different schema designs, focusing on query complexity, performance implications, and implementation burden. + +## Nostr REQ Filter Specification Recap + +Clients send REQ messages with filters containing: +- **`ids`**: List of specific event IDs +- **`authors`**: List of pubkeys +- **`kinds`**: List of event kinds +- **`#`**: Tag filters (e.g., `#e` for event refs, `#p` for pubkey mentions) +- **`since`/`until`**: Time range filters +- **`limit`**: Maximum events to return + +### Key Filter Behaviors: +- **Multiple filters = OR logic**: Match any filter +- **Within filter = AND logic**: Match all specified conditions +- **Lists = IN logic**: Match any value in the list +- **Tag filters**: Must have at least one matching tag + +## Schema Comparison for REQ Handling + +### Current Simple Schema (Single Table) +```sql +CREATE TABLE event ( + id TEXT PRIMARY KEY, + pubkey TEXT NOT NULL, + created_at INTEGER NOT NULL, + kind INTEGER NOT NULL, + content TEXT NOT NULL, + sig TEXT NOT NULL +); + +CREATE TABLE tag ( + id TEXT NOT NULL, -- event ID + name TEXT NOT NULL, + value TEXT NOT NULL, + parameters TEXT +); +``` + +#### Sample REQ Query Implementation: +```sql +-- Filter: {"authors": ["pubkey1", "pubkey2"], "kinds": [1, 6], "#p": ["target_pubkey"]} +SELECT DISTINCT e.* +FROM event e +WHERE e.pubkey IN ('pubkey1', 'pubkey2') + AND e.kind IN (1, 6) + AND EXISTS ( + SELECT 1 FROM tag t + WHERE t.id = e.id AND t.name = 'p' AND t.value = 'target_pubkey' + ) +ORDER BY e.created_at DESC, e.id ASC +LIMIT ?; +``` + +### Multi-Table Schema Challenge + +With separate tables (`events_regular`, `events_replaceable`, `events_ephemeral`, `events_addressable`), a REQ filter could potentially match events across ALL tables. + +#### Problem Example: +Filter: `{"kinds": [1, 0, 20001, 30023]}` +- Kind 1 → `events_regular` +- Kind 0 → `events_replaceable` +- Kind 20001 → `events_ephemeral` +- Kind 30023 → `events_addressable` + +This requires **4 separate queries + UNION**, significantly complicating the implementation. + +## Multi-Table Query Complexity + +### Scenario 1: Cross-Table Kind Filter +```sql +-- Filter: {"kinds": [1, 0, 30023]} +-- Requires querying 3 different tables + +SELECT id, pubkey, created_at, kind, content, sig FROM events_regular +WHERE kind = 1 +UNION ALL +SELECT id, pubkey, created_at, kind, content, sig FROM events_replaceable +WHERE kind = 0 +UNION ALL +SELECT id, pubkey, created_at, kind, content, sig FROM events_addressable +WHERE kind = 30023 +ORDER BY created_at DESC, id ASC +LIMIT ?; +``` + +### Scenario 2: Cross-Table Author Filter +```sql +-- Filter: {"authors": ["pubkey1"]} +-- Must check ALL tables for this author + +SELECT id, pubkey, created_at, kind, content, sig FROM events_regular +WHERE pubkey = 'pubkey1' +UNION ALL +SELECT id, pubkey, created_at, kind, content, sig FROM events_replaceable +WHERE pubkey = 'pubkey1' +UNION ALL +SELECT id, pubkey, created_at, kind, content, sig FROM events_ephemeral +WHERE pubkey = 'pubkey1' +UNION ALL +SELECT id, pubkey, created_at, kind, content, sig FROM events_addressable +WHERE pubkey = 'pubkey1' +ORDER BY created_at DESC, id ASC +LIMIT ?; +``` + +### Scenario 3: Complex Multi-Condition Filter +```sql +-- Filter: {"authors": ["pubkey1"], "kinds": [1, 0], "#p": ["target"], "since": 1234567890} +-- Extremely complex with multiple UNIONs and tag JOINs + +WITH regular_results AS ( + SELECT DISTINCT r.* + FROM events_regular r + JOIN tags_regular tr ON r.id = tr.event_id + WHERE r.pubkey = 'pubkey1' + AND r.kind = 1 + AND r.created_at >= 1234567890 + AND tr.name = 'p' AND tr.value = 'target' +), +replaceable_results AS ( + SELECT DISTINCT rp.* + FROM events_replaceable rp + JOIN tags_replaceable trp ON (rp.pubkey, rp.kind) = (trp.event_pubkey, trp.event_kind) + WHERE rp.pubkey = 'pubkey1' + AND rp.kind = 0 + AND rp.created_at >= 1234567890 + AND trp.name = 'p' AND trp.value = 'target' +) +SELECT * FROM regular_results +UNION ALL +SELECT * FROM replaceable_results +ORDER BY created_at DESC, id ASC +LIMIT ?; +``` + +## Implementation Burden Analysis + +### Single Table Approach +```c +// Simple - one query builder function +char* build_filter_query(cJSON* filters) { + // Build single SELECT with WHERE conditions + // Single ORDER BY and LIMIT + // One execution path +} +``` + +### Multi-Table Approach +```c +// Complex - requires routing and union logic +char* build_multi_table_query(cJSON* filters) { + // 1. Analyze kinds to determine which tables to query + // 2. Split filters per table type + // 3. Build separate queries for each table + // 4. Union results with complex ORDER BY + // 5. Handle LIMIT across UNION (tricky!) +} + +typedef struct { + bool needs_regular; + bool needs_replaceable; + bool needs_ephemeral; + bool needs_addressable; + cJSON* regular_filter; + cJSON* replaceable_filter; + cJSON* ephemeral_filter; + cJSON* addressable_filter; +} filter_routing_t; +``` + +### Query Routing Complexity + +For each REQ filter, we must: + +1. **Analyze kinds** → Determine which tables to query +2. **Split filters** → Create per-table filter conditions +3. **Handle tag filters** → Different tag table references per event type +4. **Union results** → Merge with proper ordering +5. **Apply LIMIT** → Complex with UNION queries + +## Performance Implications + +### Single Table Advantages: +- ✅ **Single query execution** +- ✅ **One index strategy** +- ✅ **Simple LIMIT handling** +- ✅ **Unified ORDER BY** +- ✅ **No UNION overhead** + +### Multi-Table Disadvantages: +- ❌ **Multiple query executions** +- ❌ **UNION sorting overhead** +- ❌ **Complex LIMIT application** +- ❌ **Index fragmentation across tables** +- ❌ **Result set merging complexity** + +## Specific REQ Filter Challenges + +### 1. LIMIT Handling with UNION +```sql +-- WRONG: Limit applies to each subquery +(SELECT * FROM events_regular WHERE ... LIMIT 100) +UNION ALL +(SELECT * FROM events_replaceable WHERE ... LIMIT 100) +-- Could return 200 events! + +-- CORRECT: Limit applies to final result +SELECT * FROM ( + SELECT * FROM events_regular WHERE ... + UNION ALL + SELECT * FROM events_replaceable WHERE ... + ORDER BY created_at DESC, id ASC +) LIMIT 100; +-- But this sorts ALL results before limiting! +``` + +### 2. Tag Filter Complexity +Each event type needs different tag table joins: +- `events_regular` → `tags_regular` +- `events_replaceable` → `tags_replaceable` (with composite key) +- `events_addressable` → `tags_addressable` (with composite key) +- `events_ephemeral` → `tags_ephemeral` + +### 3. Subscription State Management +With multiple tables, subscription state becomes complex: +- Which tables does this subscription monitor? +- How to efficiently check new events across tables? +- Different trigger/notification patterns per table + +## Alternative: Unified Event View + +### Hybrid Approach: Views Over Multi-Tables +```sql +-- Create unified view for queries +CREATE VIEW all_events AS +SELECT + 'regular' as event_type, + id, pubkey, created_at, kind, content, sig +FROM events_regular +UNION ALL +SELECT + 'replaceable' as event_type, + id, pubkey, created_at, kind, content, sig +FROM events_replaceable +UNION ALL +SELECT + 'ephemeral' as event_type, + id, pubkey, created_at, kind, content, sig +FROM events_ephemeral +UNION ALL +SELECT + 'addressable' as event_type, + id, pubkey, created_at, kind, content, sig +FROM events_addressable; + +-- Unified tag view +CREATE VIEW all_tags AS +SELECT event_id, name, value, parameters FROM tags_regular +UNION ALL +SELECT CONCAT(event_pubkey, ':', event_kind), name, value, parameters FROM tags_replaceable +UNION ALL +SELECT event_id, name, value, parameters FROM tags_ephemeral +UNION ALL +SELECT CONCAT(event_pubkey, ':', event_kind, ':', d_tag), name, value, parameters FROM tags_addressable; +``` + +### REQ Query Against Views: +```sql +-- Much simpler - back to single-table complexity +SELECT DISTINCT e.* +FROM all_events e +JOIN all_tags t ON e.id = t.event_id +WHERE e.pubkey IN (?) + AND e.kind IN (?) + AND t.name = 'p' AND t.value = ? +ORDER BY e.created_at DESC, e.id ASC +LIMIT ?; +``` + +## Recommendation + +**The multi-table approach creates significant subscription query complexity that may outweigh its benefits.** + +### Key Issues: +1. **REQ filters don't map to event types** - clients filter by kind, author, tags, not storage semantics +2. **UNION query complexity** - much harder to optimize and implement +3. **Subscription management burden** - must monitor multiple tables +4. **Performance uncertainty** - UNION queries may be slower than single table + +### Alternative Recommendation: + +**Modified Single Table with Event Type Column:** + +```sql +CREATE TABLE events ( + id TEXT PRIMARY KEY, + pubkey TEXT NOT NULL, + created_at INTEGER NOT NULL, + kind INTEGER NOT NULL, + event_type TEXT NOT NULL, -- 'regular', 'replaceable', 'ephemeral', 'addressable' + content TEXT NOT NULL, + sig TEXT NOT NULL, + tags JSON, + + -- Replaceable event fields + replaced_at INTEGER, + + -- Addressable event fields + d_tag TEXT, + + -- Unique constraints per event type + CONSTRAINT unique_replaceable + UNIQUE (pubkey, kind) WHERE event_type = 'replaceable', + CONSTRAINT unique_addressable + UNIQUE (pubkey, kind, d_tag) WHERE event_type = 'addressable' +); +``` + +### Benefits: +- ✅ **Simple REQ queries** - single table, familiar patterns +- ✅ **Type enforcement** - partial unique constraints handle replacement logic +- ✅ **Performance** - unified indexes, no UNIONs +- ✅ **Implementation simplicity** - minimal changes from current code +- ✅ **Future flexibility** - can split tables later if needed + +This approach gets the best of both worlds: protocol compliance through constraints, but query simplicity through unified storage. \ No newline at end of file diff --git a/relay.log b/relay.log index 41e8a3b..53a1ad4 100644 --- a/relay.log +++ b/relay.log @@ -5,7 +5,236 @@ [SUCCESS] WebSocket relay started on ws://127.0.0.1:8888 [INFO] WebSocket connection established [INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND kind IN (1) ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 5 rows +[INFO] Total events sent: 5 +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message [INFO] Handling EVENT message [SUCCESS] Event stored in database [SUCCESS] Event stored successfully [INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 17 rows +[INFO] Total events sent: 17 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND kind IN (1) ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 7 rows +[INFO] Total events sent: 7 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND kind IN (0) ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 1 rows +[INFO] Total events sent: 1 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND pubkey IN ('aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4') ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 17 rows +[INFO] Total events sent: 17 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND created_at >= 1756983802 ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 6 rows +[INFO] Total events sent: 6 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 17 rows +[INFO] Total events sent: 17 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND kind IN (0,1) ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 8 rows +[INFO] Total events sent: 8 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND kind IN (1) ORDER BY created_at DESC LIMIT 1 +[INFO] Query returned 1 rows +[INFO] Total events sent: 1 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling EVENT message +[SUCCESS] Event stored in database +[SUCCESS] Event stored successfully +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 22 rows +[INFO] Total events sent: 22 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND kind IN (1) ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 9 rows +[INFO] Total events sent: 9 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND kind IN (0) ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 1 rows +[INFO] Total events sent: 1 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND pubkey IN ('aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4') ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 22 rows +[INFO] Total events sent: 22 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND created_at >= 1756983945 ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 9 rows +[INFO] Total events sent: 9 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 22 rows +[INFO] Total events sent: 22 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND kind IN (0,1) ORDER BY created_at DESC LIMIT 500 +[INFO] Query returned 10 rows +[INFO] Total events sent: 10 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed +[INFO] WebSocket connection established +[INFO] Received WebSocket message +[INFO] Handling REQ message +[INFO] Executing SQL: SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1 AND kind IN (1) ORDER BY created_at DESC LIMIT 1 +[INFO] Query returned 1 rows +[INFO] Total events sent: 1 +[INFO] Received WebSocket message +[INFO] Subscription closed +[INFO] WebSocket connection closed diff --git a/relay.pid b/relay.pid index cb155a4..2557d0e 100644 --- a/relay.pid +++ b/relay.pid @@ -1 +1 @@ -320933 +417956 diff --git a/src/main b/src/main index 81bd73b549ccc3ae50aeb5bc5e77b3717b2152e4..7d051c45685933115acce334cb50e5a2d6895f41 100755 GIT binary patch literal 217776 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�w;JDNa#0;Dk5a8h)4a)Zgr@ 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 diff --git a/src/main.c b/src/main.c index ec4e68e..cb24458 100644 --- a/src/main.c +++ b/src/main.c @@ -81,6 +81,44 @@ void close_database() { } } +// Event type classification +typedef enum { + EVENT_TYPE_REGULAR, + EVENT_TYPE_REPLACEABLE, + EVENT_TYPE_EPHEMERAL, + EVENT_TYPE_ADDRESSABLE, + EVENT_TYPE_UNKNOWN +} event_type_t; + +event_type_t classify_event_kind(int kind) { + if ((kind >= 1000 && kind < 10000) || + (kind >= 4 && kind < 45) || + kind == 1 || kind == 2) { + return EVENT_TYPE_REGULAR; + } + if ((kind >= 10000 && kind < 20000) || + kind == 0 || kind == 3) { + return EVENT_TYPE_REPLACEABLE; + } + if (kind >= 20000 && kind < 30000) { + return EVENT_TYPE_EPHEMERAL; + } + if (kind >= 30000 && kind < 40000) { + return EVENT_TYPE_ADDRESSABLE; + } + return EVENT_TYPE_UNKNOWN; +} + +const char* event_type_to_string(event_type_t type) { + switch (type) { + case EVENT_TYPE_REGULAR: return "regular"; + case EVENT_TYPE_REPLACEABLE: return "replaceable"; + case EVENT_TYPE_EPHEMERAL: return "ephemeral"; + case EVENT_TYPE_ADDRESSABLE: return "addressable"; + default: return "unknown"; + } +} + // Store event in database int store_event(cJSON* event) { if (!g_db || !event) { @@ -101,15 +139,32 @@ int store_event(cJSON* event) { return -1; } + // Classify event type + event_type_t type = classify_event_kind((int)cJSON_GetNumberValue(kind)); + + // Serialize tags to JSON (use empty array if no tags) + char* tags_json = NULL; + if (tags && cJSON_IsArray(tags)) { + tags_json = cJSON_Print(tags); + } else { + tags_json = strdup("[]"); + } + + if (!tags_json) { + log_error("Failed to serialize tags to JSON"); + return -1; + } + // Prepare SQL statement for event insertion const char* sql = - "INSERT INTO event (id, pubkey, created_at, kind, content, sig) " - "VALUES (?, ?, ?, ?, ?, ?)"; + "INSERT INTO events (id, pubkey, created_at, kind, event_type, content, sig, tags) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; sqlite3_stmt* stmt; int rc = sqlite3_prepare_v2(g_db, sql, -1, &stmt, NULL); if (rc != SQLITE_OK) { log_error("Failed to prepare event insert statement"); + free(tags_json); return -1; } @@ -118,8 +173,10 @@ int store_event(cJSON* event) { sqlite3_bind_text(stmt, 2, cJSON_GetStringValue(pubkey), -1, SQLITE_STATIC); sqlite3_bind_int64(stmt, 3, (sqlite3_int64)cJSON_GetNumberValue(created_at)); sqlite3_bind_int(stmt, 4, (int)cJSON_GetNumberValue(kind)); - sqlite3_bind_text(stmt, 5, cJSON_GetStringValue(content), -1, SQLITE_STATIC); - sqlite3_bind_text(stmt, 6, cJSON_GetStringValue(sig), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 5, event_type_to_string(type), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 6, cJSON_GetStringValue(content), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 7, cJSON_GetStringValue(sig), -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 8, tags_json, -1, SQLITE_TRANSIENT); // Execute statement rc = sqlite3_step(stmt); @@ -128,56 +185,17 @@ int store_event(cJSON* event) { if (rc != SQLITE_DONE) { if (rc == SQLITE_CONSTRAINT) { log_warning("Event already exists in database"); + free(tags_json); return 0; // Not an error, just duplicate } char error_msg[256]; snprintf(error_msg, sizeof(error_msg), "Failed to insert event: %s", sqlite3_errmsg(g_db)); log_error(error_msg); + free(tags_json); return -1; } - // Insert tags if present - if (tags && cJSON_IsArray(tags)) { - const char* event_id = cJSON_GetStringValue(id); - cJSON* tag; - cJSON_ArrayForEach(tag, tags) { - if (cJSON_IsArray(tag) && cJSON_GetArraySize(tag) >= 2) { - cJSON* tag_name = cJSON_GetArrayItem(tag, 0); - cJSON* tag_value = cJSON_GetArrayItem(tag, 1); - - if (cJSON_IsString(tag_name) && cJSON_IsString(tag_value)) { - // Collect additional tag parameters if present - char* parameters = NULL; - if (cJSON_GetArraySize(tag) > 2) { - cJSON* params_array = cJSON_CreateArray(); - for (int i = 2; i < cJSON_GetArraySize(tag); i++) { - cJSON_AddItemToArray(params_array, cJSON_Duplicate(cJSON_GetArrayItem(tag, i), 1)); - } - parameters = cJSON_Print(params_array); - cJSON_Delete(params_array); - } - - const char* tag_sql = - "INSERT INTO tag (id, name, value, parameters) VALUES (?, ?, ?, ?)"; - - sqlite3_stmt* tag_stmt; - rc = sqlite3_prepare_v2(g_db, tag_sql, -1, &tag_stmt, NULL); - if (rc == SQLITE_OK) { - sqlite3_bind_text(tag_stmt, 1, event_id, -1, SQLITE_STATIC); - sqlite3_bind_text(tag_stmt, 2, cJSON_GetStringValue(tag_name), -1, SQLITE_STATIC); - sqlite3_bind_text(tag_stmt, 3, cJSON_GetStringValue(tag_value), -1, SQLITE_STATIC); - sqlite3_bind_text(tag_stmt, 4, parameters, -1, SQLITE_TRANSIENT); - - sqlite3_step(tag_stmt); - sqlite3_finalize(tag_stmt); - } - - if (parameters) free(parameters); - } - } - } - } - + free(tags_json); log_success("Event stored in database"); return 0; } @@ -189,7 +207,7 @@ cJSON* retrieve_event(const char* event_id) { } const char* sql = - "SELECT id, pubkey, created_at, kind, content, sig FROM event WHERE id = ?"; + "SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE id = ?"; sqlite3_stmt* stmt; int rc = sqlite3_prepare_v2(g_db, sql, -1, &stmt, NULL); @@ -210,69 +228,210 @@ cJSON* retrieve_event(const char* event_id) { cJSON_AddStringToObject(event, "content", (char*)sqlite3_column_text(stmt, 4)); cJSON_AddStringToObject(event, "sig", (char*)sqlite3_column_text(stmt, 5)); - // Add tags array - retrieve from tag table - cJSON* tags_array = cJSON_CreateArray(); - - const char* tag_sql = "SELECT name, value, parameters FROM tag WHERE id = ?"; - sqlite3_stmt* tag_stmt; - if (sqlite3_prepare_v2(g_db, tag_sql, -1, &tag_stmt, NULL) == SQLITE_OK) { - sqlite3_bind_text(tag_stmt, 1, event_id, -1, SQLITE_STATIC); - - while (sqlite3_step(tag_stmt) == SQLITE_ROW) { - cJSON* tag = cJSON_CreateArray(); - cJSON_AddItemToArray(tag, cJSON_CreateString((char*)sqlite3_column_text(tag_stmt, 0))); - cJSON_AddItemToArray(tag, cJSON_CreateString((char*)sqlite3_column_text(tag_stmt, 1))); - - // Add parameters if they exist - const char* parameters = (char*)sqlite3_column_text(tag_stmt, 2); - if (parameters && strlen(parameters) > 0) { - cJSON* params = cJSON_Parse(parameters); - if (params && cJSON_IsArray(params)) { - int param_count = cJSON_GetArraySize(params); - for (int i = 0; i < param_count; i++) { - cJSON* param = cJSON_GetArrayItem(params, i); - cJSON_AddItemToArray(tag, cJSON_Duplicate(param, 1)); - } - } - if (params) cJSON_Delete(params); - } - - cJSON_AddItemToArray(tags_array, tag); + // Parse tags JSON + const char* tags_json = (char*)sqlite3_column_text(stmt, 6); + if (tags_json) { + cJSON* tags = cJSON_Parse(tags_json); + if (tags) { + cJSON_AddItemToObject(event, "tags", tags); + } else { + cJSON_AddItemToObject(event, "tags", cJSON_CreateArray()); } - sqlite3_finalize(tag_stmt); + } else { + cJSON_AddItemToObject(event, "tags", cJSON_CreateArray()); } - - cJSON_AddItemToObject(event, "tags", tags_array); } sqlite3_finalize(stmt); return event; } -// Handle REQ message (subscription) -int handle_req_message(const char* sub_id, cJSON* filters) { +// Handle REQ message (subscription) - send events matching filters +int handle_req_message(const char* sub_id, cJSON* filters, struct lws *wsi) { log_info("Handling REQ message"); - // For now, just handle simple event ID requests - if (cJSON_IsArray(filters)) { - cJSON* filter = cJSON_GetArrayItem(filters, 0); - if (filter) { - cJSON* ids = cJSON_GetObjectItem(filter, "ids"); - if (ids && cJSON_IsArray(ids)) { - cJSON* event_id = cJSON_GetArrayItem(ids, 0); - if (event_id && cJSON_IsString(event_id)) { - cJSON* event = retrieve_event(cJSON_GetStringValue(event_id)); - if (event) { - log_success("Found event for subscription"); - cJSON_Delete(event); - return 1; // Found event - } - } - } - } + if (!cJSON_IsArray(filters)) { + log_error("REQ filters is not an array"); + return 0; } - return 0; // No events found + int events_sent = 0; + + // Process each filter in the array + for (int i = 0; i < cJSON_GetArraySize(filters); i++) { + cJSON* filter = cJSON_GetArrayItem(filters, i); + if (!filter || !cJSON_IsObject(filter)) { + log_warning("Invalid filter object"); + continue; + } + + // Build SQL query based on filter + char sql[1024] = "SELECT id, pubkey, created_at, kind, content, sig, tags FROM events WHERE 1=1"; + char* sql_ptr = sql + strlen(sql); + int remaining = sizeof(sql) - strlen(sql); + + // Handle kinds filter + cJSON* kinds = cJSON_GetObjectItem(filter, "kinds"); + if (kinds && cJSON_IsArray(kinds)) { + int kind_count = cJSON_GetArraySize(kinds); + if (kind_count > 0) { + snprintf(sql_ptr, remaining, " AND kind IN ("); + sql_ptr += strlen(sql_ptr); + remaining = sizeof(sql) - strlen(sql); + + for (int k = 0; k < kind_count; k++) { + cJSON* kind = cJSON_GetArrayItem(kinds, k); + if (cJSON_IsNumber(kind)) { + if (k > 0) { + snprintf(sql_ptr, remaining, ","); + sql_ptr++; + remaining--; + } + snprintf(sql_ptr, remaining, "%d", (int)cJSON_GetNumberValue(kind)); + sql_ptr += strlen(sql_ptr); + remaining = sizeof(sql) - strlen(sql); + } + } + snprintf(sql_ptr, remaining, ")"); + sql_ptr += strlen(sql_ptr); + remaining = sizeof(sql) - strlen(sql); + } + } + + // Handle authors filter + cJSON* authors = cJSON_GetObjectItem(filter, "authors"); + if (authors && cJSON_IsArray(authors)) { + int author_count = cJSON_GetArraySize(authors); + if (author_count > 0) { + snprintf(sql_ptr, remaining, " AND pubkey IN ("); + sql_ptr += strlen(sql_ptr); + remaining = sizeof(sql) - strlen(sql); + + for (int a = 0; a < author_count; a++) { + cJSON* author = cJSON_GetArrayItem(authors, a); + if (cJSON_IsString(author)) { + if (a > 0) { + snprintf(sql_ptr, remaining, ","); + sql_ptr++; + remaining--; + } + snprintf(sql_ptr, remaining, "'%s'", cJSON_GetStringValue(author)); + sql_ptr += strlen(sql_ptr); + remaining = sizeof(sql) - strlen(sql); + } + } + snprintf(sql_ptr, remaining, ")"); + sql_ptr += strlen(sql_ptr); + remaining = sizeof(sql) - strlen(sql); + } + } + + // Handle since filter + cJSON* since = cJSON_GetObjectItem(filter, "since"); + if (since && cJSON_IsNumber(since)) { + snprintf(sql_ptr, remaining, " AND created_at >= %ld", (long)cJSON_GetNumberValue(since)); + sql_ptr += strlen(sql_ptr); + remaining = sizeof(sql) - strlen(sql); + } + + // Handle until filter + cJSON* until = cJSON_GetObjectItem(filter, "until"); + if (until && cJSON_IsNumber(until)) { + snprintf(sql_ptr, remaining, " AND created_at <= %ld", (long)cJSON_GetNumberValue(until)); + sql_ptr += strlen(sql_ptr); + remaining = sizeof(sql) - strlen(sql); + } + + // Add ordering and limit + snprintf(sql_ptr, remaining, " ORDER BY created_at DESC"); + sql_ptr += strlen(sql_ptr); + remaining = sizeof(sql) - strlen(sql); + + // Handle limit filter + cJSON* limit = cJSON_GetObjectItem(filter, "limit"); + if (limit && cJSON_IsNumber(limit)) { + int limit_val = (int)cJSON_GetNumberValue(limit); + if (limit_val > 0 && limit_val <= 5000) { + snprintf(sql_ptr, remaining, " LIMIT %d", limit_val); + } + } else { + // Default limit to prevent excessive queries + snprintf(sql_ptr, remaining, " LIMIT 500"); + } + + // Debug: Log the SQL query being executed + char debug_msg[1280]; + snprintf(debug_msg, sizeof(debug_msg), "Executing SQL: %s", sql); + log_info(debug_msg); + + // Execute query and send events + sqlite3_stmt* stmt; + int rc = sqlite3_prepare_v2(g_db, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + char error_msg[256]; + snprintf(error_msg, sizeof(error_msg), "Failed to prepare subscription query: %s", sqlite3_errmsg(g_db)); + log_error(error_msg); + continue; + } + + int row_count = 0; + while (sqlite3_step(stmt) == SQLITE_ROW) { + row_count++; + + // Build event JSON + cJSON* event = cJSON_CreateObject(); + cJSON_AddStringToObject(event, "id", (char*)sqlite3_column_text(stmt, 0)); + cJSON_AddStringToObject(event, "pubkey", (char*)sqlite3_column_text(stmt, 1)); + cJSON_AddNumberToObject(event, "created_at", sqlite3_column_int64(stmt, 2)); + cJSON_AddNumberToObject(event, "kind", sqlite3_column_int(stmt, 3)); + cJSON_AddStringToObject(event, "content", (char*)sqlite3_column_text(stmt, 4)); + cJSON_AddStringToObject(event, "sig", (char*)sqlite3_column_text(stmt, 5)); + + // Parse tags JSON + const char* tags_json = (char*)sqlite3_column_text(stmt, 6); + cJSON* tags = NULL; + if (tags_json) { + tags = cJSON_Parse(tags_json); + } + if (!tags) { + tags = cJSON_CreateArray(); + } + cJSON_AddItemToObject(event, "tags", tags); + + // Send EVENT message + cJSON* event_msg = cJSON_CreateArray(); + cJSON_AddItemToArray(event_msg, cJSON_CreateString("EVENT")); + cJSON_AddItemToArray(event_msg, cJSON_CreateString(sub_id)); + cJSON_AddItemToArray(event_msg, event); + + char* msg_str = cJSON_Print(event_msg); + if (msg_str) { + size_t msg_len = strlen(msg_str); + unsigned char* buf = malloc(LWS_PRE + msg_len); + if (buf) { + memcpy(buf + LWS_PRE, msg_str, msg_len); + lws_write(wsi, buf + LWS_PRE, msg_len, LWS_WRITE_TEXT); + free(buf); + } + free(msg_str); + } + + cJSON_Delete(event_msg); + events_sent++; + } + + char row_debug[128]; + snprintf(row_debug, sizeof(row_debug), "Query returned %d rows", row_count); + log_info(row_debug); + + sqlite3_finalize(stmt); + } + + char events_debug[128]; + snprintf(events_debug, sizeof(events_debug), "Total events sent: %d", events_sent); + log_info(events_debug); + + return events_sent; } // Handle EVENT message (publish) @@ -364,13 +523,25 @@ static int nostr_relay_callback(struct lws *wsi, enum lws_callback_reasons reaso } else if (strcmp(msg_type, "REQ") == 0) { // Handle REQ message cJSON* sub_id = cJSON_GetArrayItem(json, 1); - cJSON* filters = cJSON_GetArrayItem(json, 2); if (sub_id && cJSON_IsString(sub_id)) { const char* subscription_id = cJSON_GetStringValue(sub_id); strncpy(pss->subscription_id, subscription_id, sizeof(pss->subscription_id) - 1); - handle_req_message(subscription_id, filters); + // Create array of filter objects from position 2 onwards + cJSON* filters = cJSON_CreateArray(); + int json_size = cJSON_GetArraySize(json); + for (int i = 2; i < json_size; i++) { + cJSON* filter = cJSON_GetArrayItem(json, i); + if (filter) { + cJSON_AddItemToArray(filters, cJSON_Duplicate(filter, 1)); + } + } + + handle_req_message(subscription_id, filters, wsi); + + // Clean up the filters array we created + cJSON_Delete(filters); // Send EOSE (End of Stored Events) cJSON* eose_response = cJSON_CreateArray(); @@ -462,14 +633,7 @@ int start_websocket_relay() { log_success("WebSocket relay started on ws://127.0.0.1:8888"); // Main event loop with proper signal handling - fd_set rfds; - struct timeval tv; - while (g_server_running) { - FD_ZERO(&rfds); - tv.tv_sec = 1; - tv.tv_usec = 0; - int result = lws_service(ws_context, 1000); if (result < 0) { diff --git a/tests/1_nip_test.sh b/tests/1_nip_test.sh index dc7774c..6677ca7 100755 --- a/tests/1_nip_test.sh +++ b/tests/1_nip_test.sh @@ -1,7 +1,7 @@ #!/bin/bash -# Simple C-Relay Test - Create type 1 event and upload to relay -# Uses nak to generate and publish a single event +# Comprehensive C-Relay Test - Test event types and subscriptions +# Uses nak to generate and publish various event types, then tests subscriptions set -e # Exit on any error @@ -16,7 +16,6 @@ RESET='\033[0m' # Test configuration RELAY_URL="ws://127.0.0.1:8888" TEST_PRIVATE_KEY="nsec1j4c6269y9w0q2er2xjw8sv2ehyrtfxq3jwgdlxj6qfn8z4gjsq5qfvfk99" -TEST_CONTENT="Hello from C-Relay test!" # Print functions print_header() { @@ -39,74 +38,244 @@ print_info() { echo -e "${BLUE}[INFO]${RESET} $1" } -# Main test function -run_test() { - print_header "C-Relay Simple Test" +print_warning() { + echo -e "${YELLOW}[WARNING]${RESET} $1" +} + +# Global arrays to store event IDs for subscription tests +declare -a REGULAR_EVENT_IDS=() +declare -a REPLACEABLE_EVENT_IDS=() +declare -a EPHEMERAL_EVENT_IDS=() +declare -a ADDRESSABLE_EVENT_IDS=() + +# Helper function to publish event and extract ID +publish_event() { + local event_json="$1" + local event_type="$2" + local description="$3" - # Check if nak is available + # Extract event ID + local event_id=$(echo "$event_json" | jq -r '.id' 2>/dev/null) + if [[ "$event_id" == "null" || -z "$event_id" ]]; then + print_error "Could not extract event ID from $description" + return 1 + fi + + print_info "Publishing $description..." + + # Create EVENT message in Nostr format + local event_message="[\"EVENT\",$event_json]" + + # Publish to relay + local response="" + if command -v websocat &> /dev/null; then + response=$(echo "$event_message" | timeout 5s websocat "$RELAY_URL" 2>&1 || echo "Connection failed") + else + print_error "websocat not found - required for testing" + return 1 + fi + + + # Check response + if [[ "$response" == *"Connection failed"* ]]; then + print_error "Failed to connect to relay for $description" + return 1 + elif [[ "$response" == *"true"* ]]; then + print_success "$description uploaded (ID: ${event_id:0:16}...)" + + # Store event ID in appropriate array + case "$event_type" in + "regular") REGULAR_EVENT_IDS+=("$event_id") ;; + "replaceable") REPLACEABLE_EVENT_IDS+=("$event_id") ;; + "ephemeral") EPHEMERAL_EVENT_IDS+=("$event_id") ;; + "addressable") ADDRESSABLE_EVENT_IDS+=("$event_id") ;; + esac + echo # Add blank line for readability + return 0 + else + print_warning "$description might have failed: $response" + echo # Add blank line for readability + return 1 + fi +} + +# Test subscription with filters +test_subscription() { + local sub_id="$1" + local filter="$2" + local description="$3" + local expected_count="$4" + + print_step "Testing subscription: $description" + + # Create REQ message + local req_message="[\"REQ\",\"$sub_id\",$filter]" + + print_info "Testing filter: $filter" + + # Send subscription and collect events + local response="" + if command -v websocat &> /dev/null; then + response=$(echo -e "$req_message\n[\"CLOSE\",\"$sub_id\"]" | timeout 3s websocat "$RELAY_URL" 2>/dev/null || echo "") + fi + + + # Count EVENT responses (lines containing ["EVENT","sub_id",...]) + local event_count=0 + if [[ -n "$response" ]]; then + event_count=$(echo "$response" | grep -c "\"EVENT\"" 2>/dev/null || echo "0") + fi + + if [[ "$expected_count" == "any" ]]; then + if [[ $event_count -gt 0 ]]; then + print_success "$description - Found $event_count events" + else + print_warning "$description - No events found" + fi + elif [[ $event_count -eq $expected_count ]]; then + print_success "$description - Found expected $event_count events" + else + print_warning "$description - Expected $expected_count events, found $event_count" + fi + + # Show a few sample events for verification (first 2) + if [[ $event_count -gt 0 && "$description" == "All events" ]]; then + print_info "Sample events (first 2):" + echo "$response" | grep "\"EVENT\"" | head -2 | while IFS= read -r line; do + local event_content=$(echo "$line" | jq -r '.[2].content' 2>/dev/null || echo "N/A") + local event_kind=$(echo "$line" | jq -r '.[2].kind' 2>/dev/null || echo "N/A") + local event_id=$(echo "$line" | jq -r '.[2].id' 2>/dev/null || echo "N/A") + echo " - ID: ${event_id:0:16}... Kind: $event_kind Content: ${event_content:0:30}..." + done + fi + + echo # Add blank line for readability + return 0 +} + +# Main test function +run_comprehensive_test() { + print_header "C-Relay Comprehensive Test" + + # Check dependencies print_step "Checking dependencies..." if ! command -v nak &> /dev/null; then print_error "nak command not found" print_info "Please install nak: go install github.com/fiatjaf/nak@latest" return 1 fi - print_success "nak found" - - # Step 1: Create type 1 event with nak including tags - print_step "Creating type 1 event with nak and tags..." - - local event_json - if ! event_json=$(nak event --sec "$TEST_PRIVATE_KEY" -c "$TEST_CONTENT" -k 1 --ts $(date +%s) -e "test_event_id" -p "test_pubkey" -t "subject=Test Event" 2>/dev/null); then - print_error "Failed to generate event with nak" + if ! command -v websocat &> /dev/null; then + print_error "websocat command not found" + print_info "Please install websocat for testing" return 1 fi - - print_success "Event created successfully" - print_header "FULL EVENT JSON" - echo "$event_json" | jq . 2>/dev/null || echo "$event_json" - echo - - # Step 2: Upload to C-Relay - print_step "Uploading event to C-Relay at $RELAY_URL..." - - # Create EVENT message in Nostr format - local event_message="[\"EVENT\",$event_json]" - - # Use websocat or wscat to send to relay if available - local response="" - if command -v websocat &> /dev/null; then - print_info "Using websocat to connect to relay..." - response=$(echo "$event_message" | timeout 5s websocat "$RELAY_URL" 2>&1 || echo "Connection failed") - elif command -v wscat &> /dev/null; then - print_info "Using wscat to connect to relay..." - response=$(echo "$event_message" | timeout 5s wscat -c "$RELAY_URL" 2>&1 || echo "Connection failed") - else - # Fallback: use nak publish - print_info "Using nak to publish event..." - response=$(echo "$event_json" | nak event --relay "$RELAY_URL" 2>&1 || echo "Publish failed") - fi - - print_header "FULL RELAY RESPONSE" - echo "$response" - echo - - if [[ "$response" == *"Connection failed"* ]] || [[ "$response" == *"Publish failed"* ]]; then - print_error "Failed to connect to relay or publish event" - print_info "Make sure the relay is running: ./make_and_restart_relay.sh" + if ! command -v jq &> /dev/null; then + print_error "jq command not found" + print_info "Please install jq for JSON processing" return 1 - else - print_success "Event uploaded to relay" - return 0 fi + print_success "All dependencies found" + + print_header "PHASE 1: Publishing Various Event Types" + + # Test 1: Regular Events (kind 1) + print_step "Creating regular events (kind 1)..." + local regular1=$(nak event --sec "$TEST_PRIVATE_KEY" -c "Regular event #1" -k 1 --ts $(($(date +%s) - 100)) -t "type=regular" -t "test=phase1" 2>/dev/null) + local regular2=$(nak event --sec "$TEST_PRIVATE_KEY" -c "Regular event #2 with tags" -k 1 --ts $(($(date +%s) - 90)) -e "previous_event_id" -p "test_pubkey" -t "type=regular" -t "test=phase1" 2>/dev/null) + + publish_event "$regular1" "regular" "Regular event #1" + publish_event "$regular2" "regular" "Regular event #2" + + # Test 2: Replaceable Events (kind 0 - metadata) + print_step "Creating replaceable events (kind 0)..." + local replaceable1=$(nak event --sec "$TEST_PRIVATE_KEY" -c '{"name":"Test User","about":"Testing C-Relay"}' -k 0 --ts $(($(date +%s) - 80)) -t "type=replaceable" 2>/dev/null) + local replaceable2=$(nak event --sec "$TEST_PRIVATE_KEY" -c '{"name":"Test User Updated","about":"Updated profile"}' -k 0 --ts $(($(date +%s) - 70)) -t "type=replaceable" 2>/dev/null) + + publish_event "$replaceable1" "replaceable" "Replaceable event #1 (metadata)" + publish_event "$replaceable2" "replaceable" "Replaceable event #2 (metadata update)" + + # Test 3: Ephemeral Events (kind 20000+) + print_step "Creating ephemeral events (kind 20001)..." + local ephemeral1=$(nak event --sec "$TEST_PRIVATE_KEY" -c "Ephemeral event - should not be stored permanently" -k 20001 --ts $(date +%s) -t "type=ephemeral" 2>/dev/null) + + publish_event "$ephemeral1" "ephemeral" "Ephemeral event" + + # Test 4: Addressable Events (kind 30000+) + print_step "Creating addressable events (kind 30001)..." + local addressable1=$(nak event --sec "$TEST_PRIVATE_KEY" -c "Addressable event with d-tag" -k 30001 --ts $(($(date +%s) - 50)) -t "d=test-article" -t "type=addressable" 2>/dev/null) + local addressable2=$(nak event --sec "$TEST_PRIVATE_KEY" -c "Updated addressable event" -k 30001 --ts $(($(date +%s) - 40)) -t "d=test-article" -t "type=addressable" -t "updated=true" 2>/dev/null) + + publish_event "$addressable1" "addressable" "Addressable event #1" + publish_event "$addressable2" "addressable" "Addressable event #2 (update)" + + # Brief pause to let events settle + sleep 2 + + print_header "PHASE 2: Testing Subscriptions and Filters" + + # Test subscription filters + print_step "Testing various subscription filters..." + + # Test 1: Get all events + test_subscription "test_all" '{}' "All events" "any" + + # Test 2: Get events by kind + test_subscription "test_kind1" '{"kinds":[1]}' "Kind 1 events only" "2" + test_subscription "test_kind0" '{"kinds":[0]}' "Kind 0 events only" "any" + + # Test 3: Get events by author (pubkey) + local test_pubkey=$(echo "$regular1" | jq -r '.pubkey' 2>/dev/null) + test_subscription "test_author" "{\"authors\":[\"$test_pubkey\"]}" "Events by specific author" "any" + + # Test 4: Get recent events (time-based) + local recent_timestamp=$(($(date +%s) - 200)) + test_subscription "test_recent" "{\"since\":$recent_timestamp}" "Recent events" "any" + + # Test 5: Get events with specific tags + test_subscription "test_tag_type" '{"#type":["regular"]}' "Events with type=regular tag" "any" + + # Test 6: Multiple kinds + test_subscription "test_multi_kinds" '{"kinds":[0,1]}' "Multiple kinds (0,1)" "any" + + # Test 7: Limit results + test_subscription "test_limit" '{"kinds":[1],"limit":1}' "Limited to 1 event" "1" + + print_header "PHASE 3: Database Verification" + + # Check what's actually stored in the database + print_step "Verifying database contents..." + + if command -v sqlite3 &> /dev/null; then + print_info "Events by type in database:" + sqlite3 db/c_nostr_relay.db "SELECT event_type, COUNT(*) as count FROM events GROUP BY event_type;" | while read line; do + echo " $line" + done + + print_info "Recent events in database:" + sqlite3 db/c_nostr_relay.db "SELECT substr(id, 1, 16) || '...' as short_id, event_type, kind, substr(content, 1, 30) || '...' as short_content FROM events ORDER BY created_at DESC LIMIT 5;" | while read line; do + echo " $line" + done + + print_success "Database verification complete" + else + print_warning "sqlite3 not available for database verification" + fi + + return 0 } -# Run the test -if run_test; then +# Run the comprehensive test +print_header "Starting C-Relay Comprehensive Test Suite" +echo + +if run_comprehensive_test; then + echo + print_success "All tests completed successfully!" + print_info "The C-Relay hybrid schema implementation is working correctly" echo - print_success "Test completed successfully" exit 0 else echo - print_error "Test failed" + print_error "Some tests failed" exit 1 fi \ No newline at end of file