[GSoC] migration

Joshua Root jmr at macports.org
Mon Jun 19 22:01:51 UTC 2017

On 2017-6-20 03:58 , Umesh Singla wrote:
> Hi Bradley,
> I'm having a bit difficulty in implementing the body of snapshot 
> procedure. Basically what I need to do now is (as I have written in my 
> notes, so you can tell me if I'm on right track in my thoughts as well):
> "get the list of installed ports, their-installed-variants and 
> if-requested,
> then add one port at a time to the 2nd table, its variants to the 3rd 
> table,
> after all this, add an entry in the snapshot table for the entire snapshot,
> that's it."

Taking a step back for a moment, why is an SQL database the best way to 
store this data? What sorts of queries are you going to want to run on 
it? Would a text (Tcl array) representation similar to the PortIndex be 
a better fit?

If there's a good reason for doing it in SQL, great. If not, maybe 
you're making life more difficult than it needs to be. :)

> I can get this info from `port -v installed` and `port -v installed 
> requested` command, that is, calling /action_installed/ [1] which in 
> turn, calls /registry::installed/ [2] for each port from 
> /snapshot_main/. Is this best way to go?

Using registry::installed will work, but it's not the most efficient 
since it provides the same interface as the old flat-file registry (See 

> Further, can you point me to some port action where it deals with 
> retrieving and populating tables as a hint? The /action_target/ used for 
> most of the port commands like /install/, /clean/, /fetch/ doesn't 
> really hint on how to deal with it.

These don't deal with SQL directly, they use the registry API.

> I hunted down till I reached /macports::registry.format/  --> 
> /receipt_{flat/sqlite}.tcl /files//which have a bunch of functions using 
> /registry::entry/ which I think is the most "basic" operation and then, 
> also /receipt_sqlite:://create_entry_l/function.

The way to get the list of installed ports is with 'registry::entry 
imaged'. Have a look at how reclaim.tcl does it for example.

The create_entry_l procedure is there to help in converting the old 
flat-file format to sqlite. It's probably not very relevant for you.

The registry::entry proc is indeed where much of the magic happens at 
the Tcl level. It's implemented in src/registry2.0/entry.c and calls 
down into the code in the src/cregistry directory to do the actual 
sqlite calls.

> Do I need to write for inserting into tables? If yes, write direct SQL 
> queries or Tcl procedures ( a better way, I think)?

If you do end up adding new tables to the db, you will need to add 
support for them to the entire stack from cregistry up.

- Josh

More information about the macports-dev mailing list