| 1 | <?php |
|---|
| 2 | /** |
|---|
| 3 | * @brief Dotclear database schema |
|---|
| 4 | * |
|---|
| 5 | * @package Dotclear |
|---|
| 6 | * @subpackage Core |
|---|
| 7 | * |
|---|
| 8 | * @copyright Olivier Meunier & Association Dotclear |
|---|
| 9 | * @copyright GPL-2.0-only |
|---|
| 10 | */ |
|---|
| 11 | |
|---|
| 12 | if (!defined('DC_RC_PATH')) {return;} |
|---|
| 13 | |
|---|
| 14 | if (!($_s instanceof dbStruct)) { |
|---|
| 15 | throw new Exception('No valid schema object'); |
|---|
| 16 | } |
|---|
| 17 | |
|---|
| 18 | /* Tables |
|---|
| 19 | -------------------------------------------------------- */ |
|---|
| 20 | $_s->blog |
|---|
| 21 | ->blog_id('varchar', 32, false) |
|---|
| 22 | ->blog_uid('varchar', 32, false) |
|---|
| 23 | ->blog_creadt('timestamp', 0, false, 'now()') |
|---|
| 24 | ->blog_upddt('timestamp', 0, false, 'now()') |
|---|
| 25 | ->blog_url('varchar', 255, false) |
|---|
| 26 | ->blog_name('varchar', 255, false) |
|---|
| 27 | ->blog_desc('text', 0, true) |
|---|
| 28 | ->blog_status('smallint', 0, false, 1) |
|---|
| 29 | |
|---|
| 30 | ->primary('pk_blog', 'blog_id') |
|---|
| 31 | ; |
|---|
| 32 | |
|---|
| 33 | $_s->category |
|---|
| 34 | ->cat_id('bigint', 0, false) |
|---|
| 35 | ->blog_id('varchar', 32, false) |
|---|
| 36 | ->cat_title('varchar', 255, false) |
|---|
| 37 | ->cat_url('varchar', 255, false) |
|---|
| 38 | ->cat_desc('text', 0, true) |
|---|
| 39 | ->cat_position('integer', 0, true, 0) |
|---|
| 40 | ->cat_lft('integer', 0, true) |
|---|
| 41 | ->cat_rgt('integer', 0, true) |
|---|
| 42 | |
|---|
| 43 | ->primary('pk_category', 'cat_id') |
|---|
| 44 | |
|---|
| 45 | ->unique('uk_cat_url', 'cat_url', 'blog_id') |
|---|
| 46 | ; |
|---|
| 47 | |
|---|
| 48 | $_s->session |
|---|
| 49 | ->ses_id('varchar', 40, false) |
|---|
| 50 | ->ses_time('integer', 0, false, 0) |
|---|
| 51 | ->ses_start('integer', 0, false, 0) |
|---|
| 52 | ->ses_value('text', 0, false) |
|---|
| 53 | |
|---|
| 54 | ->primary('pk_session', 'ses_id') |
|---|
| 55 | ; |
|---|
| 56 | |
|---|
| 57 | $_s->setting |
|---|
| 58 | ->setting_id('varchar', 255, false) |
|---|
| 59 | ->blog_id('varchar', 32, true) |
|---|
| 60 | ->setting_ns('varchar', 32, false, "'system'") |
|---|
| 61 | ->setting_value('text', 0, true, null) |
|---|
| 62 | ->setting_type('varchar', 8, false, "'string'") |
|---|
| 63 | ->setting_label('text', 0, true) |
|---|
| 64 | |
|---|
| 65 | ->unique('uk_setting', 'setting_ns', 'setting_id', 'blog_id') |
|---|
| 66 | ; |
|---|
| 67 | |
|---|
| 68 | $_s->user |
|---|
| 69 | ->user_id('varchar', 32, false) |
|---|
| 70 | ->user_super('smallint', 0, true) |
|---|
| 71 | ->user_status('smallint', 0, false, 1) |
|---|
| 72 | ->user_pwd('varchar', 255, false) |
|---|
| 73 | ->user_change_pwd('smallint', 0, false, 0) |
|---|
| 74 | ->user_recover_key('varchar', 32, true, null) |
|---|
| 75 | ->user_name('varchar', 255, true, null) |
|---|
| 76 | ->user_firstname('varchar', 255, true, null) |
|---|
| 77 | ->user_displayname('varchar', 255, true, null) |
|---|
| 78 | ->user_email('varchar', 255, true, null) |
|---|
| 79 | ->user_url('varchar', 255, true, null) |
|---|
| 80 | ->user_desc('text', 0, true) |
|---|
| 81 | ->user_default_blog('varchar', 32, true, null) |
|---|
| 82 | ->user_options('text', 0, true) |
|---|
| 83 | ->user_lang('varchar', 5, true, null) |
|---|
| 84 | ->user_tz('varchar', 128, false, "'UTC'") |
|---|
| 85 | ->user_post_status('smallint', 0, false, -2) |
|---|
| 86 | ->user_creadt('timestamp', 0, false, 'now()') |
|---|
| 87 | ->user_upddt('timestamp', 0, false, 'now()') |
|---|
| 88 | |
|---|
| 89 | ->primary('pk_user', 'user_id') |
|---|
| 90 | ; |
|---|
| 91 | |
|---|
| 92 | $_s->permissions |
|---|
| 93 | ->user_id('varchar', 32, false) |
|---|
| 94 | ->blog_id('varchar', 32, false) |
|---|
| 95 | ->permissions('text', 0, true) |
|---|
| 96 | |
|---|
| 97 | ->primary('pk_permissions', 'user_id', 'blog_id') |
|---|
| 98 | ; |
|---|
| 99 | |
|---|
| 100 | $_s->post |
|---|
| 101 | ->post_id('bigint', 0, false) |
|---|
| 102 | ->blog_id('varchar', 32, false) |
|---|
| 103 | ->user_id('varchar', 32, false) |
|---|
| 104 | ->cat_id('bigint', 0, true) |
|---|
| 105 | ->post_dt('timestamp', 0, false, 'now()') |
|---|
| 106 | ->post_tz('varchar', 128, false, "'UTC'") |
|---|
| 107 | ->post_creadt('timestamp', 0, false, 'now()') |
|---|
| 108 | ->post_upddt('timestamp', 0, false, 'now()') |
|---|
| 109 | ->post_password('varchar', 32, true, null) |
|---|
| 110 | ->post_type('varchar', 32, false, "'post'") |
|---|
| 111 | ->post_format('varchar', 32, false, "'xhtml'") |
|---|
| 112 | ->post_url('varchar', 255, false) |
|---|
| 113 | ->post_lang('varchar', 5, true, null) |
|---|
| 114 | ->post_title('varchar', 255, true, null) |
|---|
| 115 | ->post_excerpt('text', 0, true, null) |
|---|
| 116 | ->post_excerpt_xhtml('text', 0, true, null) |
|---|
| 117 | ->post_content('text', 0, true, null) |
|---|
| 118 | ->post_content_xhtml('text', 0, false) |
|---|
| 119 | ->post_notes('text', 0, true, null) |
|---|
| 120 | ->post_meta('text', 0, true, null) |
|---|
| 121 | ->post_words('text', 0, true, null) |
|---|
| 122 | ->post_status('smallint', 0, false, 0) |
|---|
| 123 | ->post_firstpub('smallint', 0, false, 0) |
|---|
| 124 | ->post_selected('smallint', 0, false, 0) |
|---|
| 125 | ->post_position('integer', 0, false, 0) |
|---|
| 126 | ->post_open_comment('smallint', 0, false, 0) |
|---|
| 127 | ->post_open_tb('smallint', 0, false, 0) |
|---|
| 128 | ->nb_comment('integer', 0, false, 0) |
|---|
| 129 | ->nb_trackback('integer', 0, false, 0) |
|---|
| 130 | |
|---|
| 131 | ->primary('pk_post', 'post_id') |
|---|
| 132 | |
|---|
| 133 | ->unique('uk_post_url', 'post_url', 'post_type', 'blog_id') |
|---|
| 134 | ; |
|---|
| 135 | |
|---|
| 136 | $_s->media |
|---|
| 137 | ->media_id('bigint', 0, false) |
|---|
| 138 | ->user_id('varchar', 32, false) |
|---|
| 139 | ->media_path('varchar', 255, false) |
|---|
| 140 | ->media_title('varchar', 255, false) |
|---|
| 141 | ->media_file('varchar', 255, false) |
|---|
| 142 | ->media_dir('varchar', 255, false, "'.'") |
|---|
| 143 | ->media_meta('text', 0, true, null) |
|---|
| 144 | ->media_dt('timestamp', 0, false, 'now()') |
|---|
| 145 | ->media_creadt('timestamp', 0, false, 'now()') |
|---|
| 146 | ->media_upddt('timestamp', 0, false, 'now()') |
|---|
| 147 | ->media_private('smallint', 0, false, 0) |
|---|
| 148 | |
|---|
| 149 | ->primary('pk_media', 'media_id') |
|---|
| 150 | ; |
|---|
| 151 | |
|---|
| 152 | $_s->post_media |
|---|
| 153 | ->media_id('bigint', 0, false) |
|---|
| 154 | ->post_id('bigint', 0, false) |
|---|
| 155 | ->link_type('varchar', 32, false, "'attachment'") |
|---|
| 156 | |
|---|
| 157 | ->primary('pk_post_media', 'media_id', 'post_id', 'link_type') |
|---|
| 158 | ; |
|---|
| 159 | |
|---|
| 160 | $_s->log |
|---|
| 161 | ->log_id('bigint', 0, false) |
|---|
| 162 | ->user_id('varchar', 32, true) |
|---|
| 163 | ->blog_id('varchar', 32, true) |
|---|
| 164 | ->log_table('varchar', 255, false) |
|---|
| 165 | ->log_dt('timestamp', 0, false, 'now()') |
|---|
| 166 | ->log_ip('varchar', 39, false) |
|---|
| 167 | ->log_msg('text', 0, true, null) |
|---|
| 168 | |
|---|
| 169 | ->primary('pk_log', 'log_id') |
|---|
| 170 | ; |
|---|
| 171 | |
|---|
| 172 | $_s->version |
|---|
| 173 | ->module('varchar', 64, false) |
|---|
| 174 | ->version('varchar', 32, false) |
|---|
| 175 | |
|---|
| 176 | ->primary('pk_version', 'module') |
|---|
| 177 | ; |
|---|
| 178 | |
|---|
| 179 | $_s->ping |
|---|
| 180 | ->post_id('bigint', 0, false) |
|---|
| 181 | ->ping_url('varchar', 255, false) |
|---|
| 182 | ->ping_dt('timestamp', 0, false, 'now()') |
|---|
| 183 | |
|---|
| 184 | ->primary('pk_ping', 'post_id', 'ping_url') |
|---|
| 185 | ; |
|---|
| 186 | |
|---|
| 187 | $_s->comment |
|---|
| 188 | ->comment_id('bigint', 0, false) |
|---|
| 189 | ->post_id('bigint', 0, false) |
|---|
| 190 | ->comment_dt('timestamp', 0, false, 'now()') |
|---|
| 191 | ->comment_tz('varchar', 128, false, "'UTC'") |
|---|
| 192 | ->comment_upddt('timestamp', 0, false, 'now()') |
|---|
| 193 | ->comment_author('varchar', 255, true, null) |
|---|
| 194 | ->comment_email('varchar', 255, true, null) |
|---|
| 195 | ->comment_site('varchar', 255, true, null) |
|---|
| 196 | ->comment_content('text', 0, true) |
|---|
| 197 | ->comment_words('text', 0, true, null) |
|---|
| 198 | ->comment_ip('varchar', 39, true, null) |
|---|
| 199 | ->comment_status('smallint', 0, true, 0) |
|---|
| 200 | ->comment_spam_status('varchar', 128, true, 0) |
|---|
| 201 | ->comment_spam_filter('varchar', 32, true, null) |
|---|
| 202 | ->comment_trackback('smallint', 0, false, 0) |
|---|
| 203 | |
|---|
| 204 | ->primary('pk_comment', 'comment_id') |
|---|
| 205 | ; |
|---|
| 206 | |
|---|
| 207 | $_s->meta |
|---|
| 208 | ->meta_id('varchar', 255, false) |
|---|
| 209 | ->meta_type('varchar', 64, false) |
|---|
| 210 | ->post_id('bigint', 0, false) |
|---|
| 211 | |
|---|
| 212 | ->primary('pk_meta', 'meta_id', 'meta_type', 'post_id') |
|---|
| 213 | ; |
|---|
| 214 | |
|---|
| 215 | $_s->pref |
|---|
| 216 | ->pref_id('varchar', 255, false) |
|---|
| 217 | ->user_id('varchar', 32, true) |
|---|
| 218 | ->pref_ws('varchar', 32, false, "'system'") |
|---|
| 219 | ->pref_value('text', 0, true, null) |
|---|
| 220 | ->pref_type('varchar', 8, false, "'string'") |
|---|
| 221 | ->pref_label('text', 0, true) |
|---|
| 222 | |
|---|
| 223 | ->unique('uk_pref', 'pref_ws', 'pref_id', 'user_id') |
|---|
| 224 | ; |
|---|
| 225 | |
|---|
| 226 | /* References indexes |
|---|
| 227 | -------------------------------------------------------- */ |
|---|
| 228 | $_s->category->index('idx_category_blog_id', 'btree', 'blog_id'); |
|---|
| 229 | $_s->category->index('idx_category_cat_lft_blog_id', 'btree', 'blog_id', 'cat_lft'); |
|---|
| 230 | $_s->category->index('idx_category_cat_rgt_blog_id', 'btree', 'blog_id', 'cat_rgt'); |
|---|
| 231 | $_s->setting->index('idx_setting_blog_id', 'btree', 'blog_id'); |
|---|
| 232 | $_s->user->index('idx_user_user_default_blog', 'btree', 'user_default_blog'); |
|---|
| 233 | $_s->permissions->index('idx_permissions_blog_id', 'btree', 'blog_id'); |
|---|
| 234 | $_s->post->index('idx_post_cat_id', 'btree', 'cat_id'); |
|---|
| 235 | $_s->post->index('idx_post_user_id', 'btree', 'user_id'); |
|---|
| 236 | $_s->post->index('idx_post_blog_id', 'btree', 'blog_id'); |
|---|
| 237 | $_s->media->index('idx_media_user_id', 'btree', 'user_id'); |
|---|
| 238 | $_s->post_media->index('idx_post_media_post_id', 'btree', 'post_id'); |
|---|
| 239 | $_s->post_media->index('idx_post_media_media_id', 'btree', 'media_id'); |
|---|
| 240 | $_s->log->index('idx_log_user_id', 'btree', 'user_id'); |
|---|
| 241 | $_s->comment->index('idx_comment_post_id', 'btree', 'post_id'); |
|---|
| 242 | $_s->meta->index('idx_meta_post_id', 'btree', 'post_id'); |
|---|
| 243 | $_s->meta->index('idx_meta_meta_type', 'btree', 'meta_type'); |
|---|
| 244 | $_s->pref->index('idx_pref_user_id', 'btree', 'user_id'); |
|---|
| 245 | |
|---|
| 246 | /* Performance indexes |
|---|
| 247 | -------------------------------------------------------- */ |
|---|
| 248 | $_s->comment->index('idx_comment_post_id_dt_status', 'btree', 'post_id', 'comment_dt', 'comment_status'); |
|---|
| 249 | $_s->post->index('idx_post_post_dt', 'btree', 'post_dt'); |
|---|
| 250 | $_s->post->index('idx_post_post_dt_post_id', 'btree', 'post_dt', 'post_id'); |
|---|
| 251 | $_s->post->index('idx_blog_post_post_dt_post_id', 'btree', 'blog_id', 'post_dt', 'post_id'); |
|---|
| 252 | $_s->post->index('idx_blog_post_post_status', 'btree', 'blog_id', 'post_status'); |
|---|
| 253 | $_s->blog->index('idx_blog_blog_upddt', 'btree', 'blog_upddt'); |
|---|
| 254 | $_s->user->index('idx_user_user_super', 'btree', 'user_super'); |
|---|
| 255 | |
|---|
| 256 | /* Foreign keys |
|---|
| 257 | -------------------------------------------------------- */ |
|---|
| 258 | $_s->category->reference('fk_category_blog', 'blog_id', 'blog', 'blog_id', 'cascade', 'cascade'); |
|---|
| 259 | $_s->setting->reference('fk_setting_blog', 'blog_id', 'blog', 'blog_id', 'cascade', 'cascade'); |
|---|
| 260 | $_s->user->reference('fk_user_default_blog', 'user_default_blog', 'blog', 'blog_id', 'cascade', 'set null'); |
|---|
| 261 | $_s->permissions->reference('fk_permissions_blog', 'blog_id', 'blog', 'blog_id', 'cascade', 'cascade'); |
|---|
| 262 | $_s->permissions->reference('fk_permissions_user', 'user_id', 'user', 'user_id', 'cascade', 'cascade'); |
|---|
| 263 | $_s->post->reference('fk_post_category', 'cat_id', 'category', 'cat_id', 'cascade', 'set null'); |
|---|
| 264 | $_s->post->reference('fk_post_user', 'user_id', 'user', 'user_id', 'cascade', 'cascade'); |
|---|
| 265 | $_s->post->reference('fk_post_blog', 'blog_id', 'blog', 'blog_id', 'cascade', 'cascade'); |
|---|
| 266 | $_s->media->reference('fk_media_user', 'user_id', 'user', 'user_id', 'cascade', 'cascade'); |
|---|
| 267 | $_s->post_media->reference('fk_media', 'media_id', 'media', 'media_id', 'cascade', 'cascade'); |
|---|
| 268 | $_s->post_media->reference('fk_media_post', 'post_id', 'post', 'post_id', 'cascade', 'cascade'); |
|---|
| 269 | $_s->ping->reference('fk_ping_post', 'post_id', 'post', 'post_id', 'cascade', 'cascade'); |
|---|
| 270 | $_s->comment->reference('fk_comment_post', 'post_id', 'post', 'post_id', 'cascade', 'cascade'); |
|---|
| 271 | $_s->log->reference('fk_log_blog', 'blog_id', 'blog', 'blog_id', 'cascade', 'set null'); |
|---|
| 272 | $_s->meta->reference('fk_meta_post', 'post_id', 'post', 'post_id', 'cascade', 'cascade'); |
|---|
| 273 | $_s->pref->reference('fk_pref_user', 'user_id', 'user', 'user_id', 'cascade', 'cascade'); |
|---|
| 274 | |
|---|
| 275 | /* PostgreSQL specific indexes |
|---|
| 276 | -------------------------------------------------------- */ |
|---|
| 277 | if ($_s->driver() == 'pgsql') { |
|---|
| 278 | $_s->setting->index('idx_setting_blog_id_null', 'btree', '(blog_id IS NULL)'); |
|---|
| 279 | $_s->media->index('idx_media_media_path', 'btree', 'media_path', 'media_dir'); |
|---|
| 280 | $_s->pref->index('idx_pref_user_id_null', 'btree', '(user_id IS NULL)'); |
|---|
| 281 | } |
|---|