Listing 7. Insertion of Facts into an RDF
Datasource from a Script

// --- globals ---
klass.datasource
 = Cc["@mozilla.org/rdf/datasource;1" +
      "?name=in-memory-datasource"];
klass.rdf
 = Cc["@mozilla.org/rdf/rdf-service;1"];

var schema = "http://www.example.org/ProcData#";
var props =
  [ "pid", "ppid", "pcpu", "time", "vsz",
    "group", "nice", "user", "args" ];

var rdf = klass.rdf.getService(Ci.nsIRDFService);

var root  = rdf.GetResource(schema + "ProcList");
var child = rdf.GetResource(schema + "child");
var preds = [];

for (var p in props)
  preds[p] = rdf.GetResource(schema + props[p]);

// --- mainline ---

window.addEventListener("load",load_handler,true);

// --- functions ---

function update_tree() {
  var tree = document.getElementById("proc-tree");

  // get the in-memory ds, not the rdf:localstore
  var ds   = tree.database.GetDataSources();
      ds   = ( ds.getNext(), ds.getNext() );
      ds   = ds.QueryInterface(Ci.nsIRDFDataSource);

  var sub, pred, obj;

  for (var i=0; i < psdata.length; i++)
  {
    if ( psdata[i][1] == "0" )  // a root node
      sub = root;
    else                        // a child node
      sub = rdf.GetResource(
             schema + "process-" + psdata[i][1]);

    pred = child;
    obj = rdf.GetResource(
             schema + "process-" + psdata[i][0]);

    ds.Assert(sub, pred, obj, true);

    // add all properties for this process

    sub = obj;
    for (var j=0; j < psdata[i].length; j++)
    {
      pred = preds[j];
      obj = rdf.GetLiteral(psdata[i][j]);
      ds.Assert(sub, pred, obj, true);
    }
  }
}

function load_handler() {
  var tree = document.getElementById("proc-tree");
  var ds = klass.datasource.createInstance(
                     Ci.nsIRDFInMemoryDataSource);
  tree.database.AddDataSource(ds);

  update_tree();
}

