func (c *Context) init() { // skip if the post processing already exists for this simid in the db dummy := 0 err := c.QueryRow("SELECT AgentId FROM Agents WHERE SimId = ? LIMIT 1", c.Simid).Scan(&dummy) if err == nil { panic(AlreadyPostErr(c.Simid)) } else if err != sql.ErrNoRows { panicif(err) } tx, err := c.Begin() panicif(err) // build Agents table sql := `INSERT INTO Agents SELECT n.SimId,n.AgentId,n.Kind,n.Spec,n.Prototype,n.ParentId,n.Lifetime,n.EnterTime,x.ExitTime FROM AgentEntry AS n LEFT JOIN AgentExit AS x ON n.AgentId = x.AgentId AND n.SimId = x.SimId AND n.SimId = ?;` _, err = tx.Exec(sql, c.Simid) panicif(err) c.nodes = make([]*Node, 0, 10000) c.mappednodes = map[int32]struct{}{} // build TimeList table sql = "SELECT Duration FROM Info WHERE SimId = ?;" rows, err := tx.Query(sql, c.Simid) panicif(err) defer rows.Close() for rows.Next() { var dur int panicif(rows.Scan(&dur)) for i := 0; i < dur; i++ { _, err := tx.Exec("INSERT INTO TimeList VALUES (?, ?);", c.Simid, i) panicif(err) } } panicif(rows.Err()) // create temp res table without simid c.Log.Println("Creating temporary resource table...") c.tmpResTbl = "tmp_restbl_" + fmt.Sprintf("%x", c.Simid) _, err = tx.Exec("DROP TABLE IF EXISTS " + c.tmpResTbl) panicif(err) sql = "CREATE TABLE " + c.tmpResTbl + " AS SELECT ResourceId,TimeCreated,Parent1,Parent2,QualId,Quantity FROM Resources WHERE SimId = ?;" _, err = tx.Exec(sql, c.Simid) panicif(err) c.Log.Println("Indexing temporary resource table...") _, err = tx.Exec(query.Index(c.tmpResTbl, "Parent1")) panicif(err) _, err = tx.Exec(query.Index(c.tmpResTbl, "Parent2")) panicif(err) tx.Commit() // create prepared statements c.tmpResStmt, err = c.Prepare(resSqlHead + c.tmpResTbl + resSqlTail) panicif(err) c.dumpStmt, err = c.Prepare(dumpSql) panicif(err) c.ownerStmt, err = c.Prepare(ownerSql) panicif(err) }
// The number of sql commands to buffer before dumping to the output database. const DumpFreq = 100000 var ( preExecStmts = []string{ "CREATE TABLE IF NOT EXISTS AgentExit (SimId BLOB,AgentId INTEGER,ExitTime INTEGER);", "CREATE TABLE IF NOT EXISTS Compositions (SimId BLOB,QualId INTEGER,NucId INTEGER, MassFrac REAL);", "CREATE TABLE IF NOT EXISTS Products (SimId BLOB,QualId INTEGER,Quality TEXT);", "CREATE TABLE IF NOT EXISTS Resources (SimId INTEGER,ResourceId INTEGER,ObjId INTEGER,Type TEXT,TimeCreated INTEGER,Quantity REAL,Units TEXT,QualId INTEGER,Parent1 INTEGER,Parent2 INTEGER);", "CREATE TABLE IF NOT EXISTS ResCreators (SimId INTEGER,ResourceId INTEGER,AgentId INTEGER);", "CREATE TABLE IF NOT EXISTS Agents (SimId BLOB,AgentId INTEGER,Kind TEXT,Spec TEXT,Prototype TEXT,ParentId INTEGER,Lifetime INTEGER,EnterTime INTEGER,ExitTime INTEGER);", "CREATE TABLE IF NOT EXISTS Inventories (SimId BLOB,ResourceId INTEGER,AgentId INTEGER,StartTime INTEGER,EndTime INTEGER,QualId INTEGER,Quantity REAL);", "CREATE TABLE IF NOT EXISTS TimeList (SimId BLOB, Time INTEGER);", "CREATE TABLE IF NOT EXISTS Transactions (SimId BLOB, TransactionId INTEGER, SenderId INTEGER, ReceiverId INTEGER, ResourceId INTEGER, Commodity TEXT, Time INTEGER);", query.Index("TimeList", "Time"), query.Index("Resources", "SimId", "ResourceId", "QualId"), query.Index("Compositions", "SimId", "QualId", "NucId"), query.Index("Transactions", "SimId", "ResourceId"), query.Index("Transactions", "TransactionId"), query.Index("ResCreators", "SimId", "ResourceId"), } postExecStmts = []string{ query.Index("Agents", "SimId", "Prototype"), query.Index("Inventories", "SimId", "AgentId"), query.Index("Inventories", "SimId", "ResourceId", "StartTime"), "ANALYZE;", } dumpSql = "INSERT INTO Inventories VALUES (?,?,?,?,?,?,?);" resSqlHead = "SELECT ResourceId,TimeCreated,QualId,Quantity FROM " resSqlTail = " WHERE Parent1 = ? OR Parent2 = ?;"