Fossil

Check-in [3f739d4da7]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Relax the schema requirements. This branch of Fossil can now work with older database schemas. A "fossil rebuild" is still recommended, and goofy displays, especially of the /finfo page, might result if the rebuild is omitted. But the obsolete schema errors are avoided. This is expected to simplify the upgrade path.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | mlink-improvements
Files: files | file ages | folders
SHA1: 3f739d4da7340ec89e4e8364cd7d627ec60cfdcb
User & Date: drh 2015-01-26 13:08:12.841
Context
2015-01-26
13:52
Remove the option in /finfo to show all changes to a file. Show the first change only. And do not attempt to put that change on the trunk, but really show the first actual change. check-in: 5f6ee7ce04 user: drh tags: mlink-improvements
13:08
Relax the schema requirements. This branch of Fossil can now work with older database schemas. A "fossil rebuild" is still recommended, and goofy displays, especially of the /finfo page, might result if the rebuild is omitted. But the obsolete schema errors are avoided. This is expected to simplify the upgrade path. check-in: 3f739d4da7 user: drh tags: mlink-improvements
11:58
Merge recent trunk enhancements. check-in: 3c3c166c89 user: drh tags: mlink-improvements
Changes
Unified Diff Ignore Whitespace Patch
Changes to src/db.c.
1173
1174
1175
1176
1177
1178
1179










1180
1181
1182
1183
1184
1185
1186
    }
  }
  g.zRepositoryName = mprintf("%s", zDbName);
  db_open_or_attach(g.zRepositoryName, "repository", 0);
  g.repositoryOpen = 1;
  /* Cache "allow-symlinks" option, because we'll need it on every stat call */
  g.allowSymlinks = db_get_boolean("allow-symlinks", 0);










}

/*
** Flags for the db_find_and_open_repository() function.
*/
#if INTERFACE
#define OPEN_OK_NOT_FOUND    0x001      /* Do not error out if not found */







>
>
>
>
>
>
>
>
>
>







1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
    }
  }
  g.zRepositoryName = mprintf("%s", zDbName);
  db_open_or_attach(g.zRepositoryName, "repository", 0);
  g.repositoryOpen = 1;
  /* Cache "allow-symlinks" option, because we'll need it on every stat call */
  g.allowSymlinks = db_get_boolean("allow-symlinks", 0);
  g.zAuxSchema = db_get("aux-schema","");
  if( !db_table_has_column("repository","mlink","isaux") ){
    db_begin_transaction();
    db_multi_exec(
      "ALTER TABLE %s.mlink ADD COLUMN pmid INTEGER DEFAULT 0;"
      "ALTER TABLE %s.mlink ADD COLUMN isaux INTEGER DEFAULT 0;",
      db_name("repository"), db_name("repository")
    );
    db_end_transaction(0);
  }
}

/*
** Flags for the db_find_and_open_repository() function.
*/
#if INTERFACE
#define OPEN_OK_NOT_FOUND    0x001      /* Do not error out if not found */
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
  return zDb;
}

/*
** Return TRUE if the schema is out-of-date
*/
int db_schema_is_outofdate(void){
  if( g.zAuxSchema==0 ) g.zAuxSchema = db_get("aux-schema","");
  return strcmp(g.zAuxSchema,AUX_SCHEMA_MIN)<0
      || strcmp(g.zAuxSchema,AUX_SCHEMA_MAX)>0;
}

/*
** Return true if the database is writeable
*/







<







1250
1251
1252
1253
1254
1255
1256

1257
1258
1259
1260
1261
1262
1263
  return zDb;
}

/*
** Return TRUE if the schema is out-of-date
*/
int db_schema_is_outofdate(void){

  return strcmp(g.zAuxSchema,AUX_SCHEMA_MIN)<0
      || strcmp(g.zAuxSchema,AUX_SCHEMA_MAX)>0;
}

/*
** Return true if the database is writeable
*/
Changes to src/schema.c.
42
43
44
45
46
47
48
49
50



51
52
53
54
55
56
57
** The content tables have a content version number which rarely
** changes.  The aux tables have an arbitrary version number (typically
** a date) which can change frequently.  When the content schema changes,
** we have to execute special procedures to update the schema.  When
** the aux schema changes, all we need to do is rebuild the database.
*/
#define CONTENT_SCHEMA  "2"
#define AUX_SCHEMA_MIN  "2015-01-24"
#define AUX_SCHEMA_MAX  "2015-01-24"




#endif /* INTERFACE */


/*
** The schema for a repository database.
**







|

>
>
>







42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
** The content tables have a content version number which rarely
** changes.  The aux tables have an arbitrary version number (typically
** a date) which can change frequently.  When the content schema changes,
** we have to execute special procedures to update the schema.  When
** the aux schema changes, all we need to do is rebuild the database.
*/
#define CONTENT_SCHEMA  "2"
#define AUX_SCHEMA_MIN  "2011-04-25 19:50"
#define AUX_SCHEMA_MAX  "2015-01-24"
/* NB:  Some features require the latest schema.  Warning or error messages
** will appear if an older schema is used.  However, the older schemas are
** adequate for many common functions. */

#endif /* INTERFACE */


/*
** The schema for a repository database.
**
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
@ -- Filenames
@ --
@ CREATE TABLE filename(
@   fnid INTEGER PRIMARY KEY,    -- Filename ID
@   name TEXT UNIQUE             -- Name of file page
@ );
@
@
@ -- A "file class" is like a filename except that it remains constant
@ -- across renames.
@ --
@ CREATE TABLE fileclass(
@   fclass INTEGER PRIMARY KEY,          -- Unique id for this fileclass
@   ckid INTEGER REFERENCES plink(cid),  -- Checkin where file originates
@   fnid INTEGER REFERENCES filename     -- Name of the file in ckid
@ );
@
@ -- Linkages between checkins, files created by each checkin, and
@ -- the names of those files.
@ -- 
@ -- Each entry represents a file that changed content from pid to fid
@ -- due to the check-in that goes from pmid to mid.  fnid is the name
@ -- of the file in the mid check-in.  If the file was renamed as part
@ -- of the mid check-in, then pfnid is the previous filename.
@
@ -- There can be multiple entries for (mid,fid) if the mid checkin was
@ -- a merge.  Entries with isaux==0 are from the primary parent.  Merge
@ -- parents have isaux set to true.
@ --
@ -- Field name mnemonics:
@ --    mid = Manifest ID.  (Each check-in is stored as a "Manifest")
@ --    fid = File ID.
@ --    pmid = Parent Manifest ID.
@ --    pid = Parent file ID.
@ --    fnid = File Name ID.
@ --    pfnid = Parent File Name ID.
@ --    fclass = FileCLASS id.
@ --    isaux = pmid IS AUXiliary parent, not primary parent
@ --
@ -- pid==0 if the file is added by checkin mid.
@ -- fid==0 if the file is removed by checkin mid.
@ --
@ CREATE TABLE mlink(
@   mid INTEGER REFERENCES plink(cid),  -- Checkin that contains fid
@   fid INTEGER REFERENCES blob,        -- New file content. 0 if deleted
@   pmid INTEGER REFERENCES plink(cid), -- Checkin that contains pid
@   pid INTEGER REFERENCES blob,        -- Prev file content. 0 if new
@   fnid INTEGER REFERENCES filename,   -- Name of the file
@   pfnid INTEGER REFERENCES filename,  -- Previous name. 0 if unchanged
@   mperm INTEGER,                      -- File permissions.  1==exec
@   fclass INTEGER REFERENCE fileclass, -- fid is an instance of this class
@   isaux BOOLEAN DEFAULT 0             -- TRUE if pmid is the primary
@ );
@ CREATE INDEX mlink_i1 ON mlink(mid);
@ CREATE INDEX mlink_i2 ON mlink(fnid);
@ CREATE INDEX mlink_i3 ON mlink(fid);
@ CREATE INDEX mlink_i4 ON mlink(pid);
@







<
<
<
<
<
<
<
<
<
<



















<













<







226
227
228
229
230
231
232










233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251

252
253
254
255
256
257
258
259
260
261
262
263
264

265
266
267
268
269
270
271
@ -- Filenames
@ --
@ CREATE TABLE filename(
@   fnid INTEGER PRIMARY KEY,    -- Filename ID
@   name TEXT UNIQUE             -- Name of file page
@ );
@










@ -- Linkages between checkins, files created by each checkin, and
@ -- the names of those files.
@ -- 
@ -- Each entry represents a file that changed content from pid to fid
@ -- due to the check-in that goes from pmid to mid.  fnid is the name
@ -- of the file in the mid check-in.  If the file was renamed as part
@ -- of the mid check-in, then pfnid is the previous filename.
@
@ -- There can be multiple entries for (mid,fid) if the mid checkin was
@ -- a merge.  Entries with isaux==0 are from the primary parent.  Merge
@ -- parents have isaux set to true.
@ --
@ -- Field name mnemonics:
@ --    mid = Manifest ID.  (Each check-in is stored as a "Manifest")
@ --    fid = File ID.
@ --    pmid = Parent Manifest ID.
@ --    pid = Parent file ID.
@ --    fnid = File Name ID.
@ --    pfnid = Parent File Name ID.

@ --    isaux = pmid IS AUXiliary parent, not primary parent
@ --
@ -- pid==0 if the file is added by checkin mid.
@ -- fid==0 if the file is removed by checkin mid.
@ --
@ CREATE TABLE mlink(
@   mid INTEGER REFERENCES plink(cid),  -- Checkin that contains fid
@   fid INTEGER REFERENCES blob,        -- New file content. 0 if deleted
@   pmid INTEGER REFERENCES plink(cid), -- Checkin that contains pid
@   pid INTEGER REFERENCES blob,        -- Prev file content. 0 if new
@   fnid INTEGER REFERENCES filename,   -- Name of the file
@   pfnid INTEGER REFERENCES filename,  -- Previous name. 0 if unchanged
@   mperm INTEGER,                      -- File permissions.  1==exec

@   isaux BOOLEAN DEFAULT 0             -- TRUE if pmid is the primary
@ );
@ CREATE INDEX mlink_i1 ON mlink(mid);
@ CREATE INDEX mlink_i2 ON mlink(fnid);
@ CREATE INDEX mlink_i3 ON mlink(fid);
@ CREATE INDEX mlink_i4 ON mlink(pid);
@