Generating all possible repetitions of an event would (in theory) fill up your storage with events that would most likely never ever be seen by the user (congrats on your 999,999,999,999,999,999,999th birthday!).
It takes a bit more work, but the solution is to basically store a table (or tables) of repetition rules which you link your calendar entries to as you build a calendar:
"for every day of the week being shown, check for events which repeat on those days"
"for every week of the month being shown, check for events which repeat in those weeks"
"for every month in a year", etc...
How many of these checks you have to do depends on how many types (and duration) of repetitions you'd want.
As for supressing events, that's yet another table listing points at dates/times which have to be supressed. "if showing mondays, show all events that repeat on months, except the ones listed in the supression table"
comment followup:
Well, you'd have your standard calendar entry table, to store the core information. date/time, etc... Then at least two other tables to store the repeat information. One that stores your repetition rules. "every monday", "first day of month", "every year", etc..., and a third table that links between the calendar entries and the the rules
so:
calendar entries table <---> link table <---> repeat rules table
Querying would be a matter of building things so that for the date you're considering, the appropriate rules come out and give you the IDs of calendar entries to display. Could get ugly if you do a fancy query that dynamically links to the appropriate rules based on a date you've passed in.