//    public StructuralSummaryIndex(String indexName,int numOfKeys)
 //    {
 //        //this.qNameList=qNamelist;
 //        //this.nodeList=nodeList;
 //        this.indexName=indexName;
 //        this.numOfKeys=numOfKeys;
 //        logicFileMgr = LogicalFileManager.Instance;
 //        bufMngr = BufferManager.getInstance();
 //        XBufferChannel=new XBufferChannel();//vasl bshe b buf mgr:getfreepage()
 //        XBufferChannel.clear();
 //    }
 public StructuralSummaryIndex(int indexPage, String indexName) throws IOException, DBException {
   // usage: openning of existing SSIndex object.
   this.indexName = indexName;
   this.indexPage = indexPage; // always the same
   this.workingPage = indexPage; // may change
   logicFileMgr = LogicalFileManager.Instance;
   bufMngr = BufferManager.getInstance();
   xBufferChannel = new XBufferChannel(); // new ham lazem nis //vasl bshe b buf mgr:getfreepage()
   // xBufferChannel.clear(); //LaZEM NIs
   xBufferChannel = bufMngr.getPage(indexPage); // may change
   xBufferChannel.position(Settings.freeOffsetPos); // 5
   freeOffset = xBufferChannel.getInt(); // init
   xBufferChannel.position(Settings.numOfKeysPos);
   numOfKeys = xBufferChannel.getInt(); // init
   unTakenNodes = numOfKeys;
 }
 public StructuralSummaryIndex(String indexName) throws IOException, DBException {
   // usage: creation of nonExisting index
   this.indexName = indexName;
   this.numOfKeys = 0;
   nodeList = new ArrayList();
   logicFileMgr = LogicalFileManager.Instance;
   bufMngr = BufferManager.getInstance();
   xBufferChannel = bufMngr.getFreePage();
   this.indexPage = createSSIndexPage();
   this.workingPage = this.indexPage;
   // XBufferChannel=bufMngr.getPage(indexPage);//vasl bshe b buf mgr:getfreepage()
   // XBufferChannel.clear();
   int keysAdded = 0;
   freeOffset = Settings.dataStartPos; // initialize
   xBufferChannel.position(Settings.dataStartPos);
 }
 private void loadSSPage(int PageNo) throws IOException, DBException {
   // LOADs a page into memory:
   xBufferChannel.clear();
   xBufferChannel = bufMngr.getPage(PageNo);
   xBufferChannel.position(Settings.freeOffsetPos); // 5
   freeOffset = xBufferChannel.getInt();
   xBufferChannel.position(Settings.numOfKeysPos);
   numOfKeys = xBufferChannel.getInt();
   unTakenNodes = numOfKeys;
 }
  public StructuralSummaryNode next() throws IOException, DBException // for Iterator
      {
    // read record from file
    // transform into ssNode
    int CID;
    int qNameLen;
    String qName;
    byte[] qNameSeq;
    int parentCID;
    StructuralSummaryNode currentNode = new StructuralSummaryNode();
    int nextPage; // needed in case that data is written in more than one page
    while (true) {
      // if(unTakenNodes!=0 &&XBufferChannel.position()+2*Settings.sizeOfInt<=Settings.pageSize)
      // agar dorost bkhunim har bar position sare yek record mi iste:
      if (unTakenNodes != 0 && xBufferChannel.position() < freeOffset) {
        // bayd daghigh tar chek bshe.
        // stroage format in ssIndex: cid(int),qlen(int),qSeq(byte array),parentCId(int)

        CID = xBufferChannel.getInt();
        logManager.LogManager.log(1, "CID: " + CID);
        qNameLen = xBufferChannel.getInt();
        int reqSpace = qNameLen + Settings.sizeOfInt;
        int capacity = Settings.pageSize - xBufferChannel.position();
        if (reqSpace <= capacity) {
          qNameSeq = new byte[qNameLen];
          xBufferChannel.get(qNameSeq, 0, qNameLen);
          qName = new String(qNameSeq);
          parentCID = xBufferChannel.getInt();
          currentNode.setCID(CID);
          currentNode.setParentCID(parentCID);
          currentNode.setQName(qName);
          unTakenNodes--;
          return currentNode; // return breaks loop!
        }
      } else {

        //               if(unTakenNodes==0)//in k ghalate baz :(
        //               {   return null;  }
        //               else //if(XBufferChannel.position()+2*Settings.sizeOfInt>Settings.pageSize)
        //               {    //goTOnextPAge;
        xBufferChannel.position(Settings.nextPagePos);
        nextPage = xBufferChannel.getInt();
        bufMngr.unpinBuffer(xBufferChannel);
        if (nextPage > 0) {
          loadSSPage(nextPage); // prepares XBufferChannel and loads page into it.
          //                      System.out.println("loaded:"+nextPage);

        } else return null;
        workingPage = nextPage;
        xBufferChannel.position(
            Settings.dataStartPos); // instead of calling open(somehow opens nextpage)
        //               }
      }
    } // end while
  }
  public BTreeInternalNode(InternalBuffer xBuf, String indexName) {

    logicFileMgr = LogicalFileManager.Instance;
    this.indexName = indexName;
    bufMngr = BufferManager.getInstance();
    InternalBuffer = xBuf;
    InternalBuffer.position(Settings.freeOffsetPos); // 5
    testPos = InternalBuffer.position();
    freeOffset = InternalBuffer.getInt();
    // byteBuf=xBuf.getByteBuffer();
    InternalBuffer.position(Settings.isLeafPos);
    testPos = InternalBuffer.position();

    isLeaf = InternalBuffer.get();
    // InternalBuffer.position(Settings.numOfKeysPos);
    numOfKeys = InternalBuffer.getInt();
  }
 public HashMap checkBufPool() {
   logManager.LogManager.log(0, "Checking bufPool status");
   return bufMgr.getPoolStatus();
 }
/** @author MohsenCs */
public class PostgreDB {
  private String docName; // haman db name
  private BTreeIndex bTreeIndex;
  private ElementIndex elemIndex;
  private StructuralSummaryIndex structSumIndex;
  private PostgreDBManager dbdocMgr;
  private BufferManager bufMgr = BufferManager.getInstance();
  // IndexManager indexMgr;
  private List<DeweyID> Deweylist;
  private static int num = 0;
  private Connection con = null;

  public PostgreDB() {}

  public PostgreDB(String docName) throws IOException {
    dbdocMgr = PostgreDBManager.Instance;

    try {
      String dbURL = "jdbc:postgresql://localhost:5432/XMLDB";
      String userName = "******";
      String password = "******";
      con = DriverManager.getConnection(dbURL, userName, password);
    } catch (SQLException e) {
      System.out.println("JDBC Driver is not Configured Correctly !");
      e.printStackTrace();

      return;
    }
  }

  public List getDeweyList() {
    return Deweylist;
  }

  public HashMap checkBufPool() {
    logManager.LogManager.log(0, "Checking bufPool status");
    return bufMgr.getPoolStatus();
  }

  public void addElement(DeweyID deweyID, String qName, int parentCID, boolean qNameFound)
      throws IOException, Exception, SQLException {
    try {
      if (con != null) {
        String sqlQuery = "INSERT INTO \"OrderedByCID\" (\"CID\", \"DeweyID\") VALUES (?, ?);";
        PreparedStatement pst = con.prepareStatement(sqlQuery);
        pst.setInt(1, deweyID.getCID());
        pst.setString(2, deweyID.toString());
        pst.executeUpdate();
        pst.close();
      }
    } catch (SQLException e) {
      System.out.println("JDBC Driver is not Configured Correctly !");
      e.printStackTrace();
      return;
    }
  }

  public void addAttribute(DeweyID deweyID, String qName, int parentCID, boolean qNameFound)
      throws IOException, Exception {
    // parentCID is curNode's CID
    //        logManager.LogManager.log(6,qName);
    //        logManager.LogManager.log(6,"Attrib: "+deweyID.toString());
    //        logManager.LogManager.log(6,String.valueOf(deweyID.getCID()));
    //        }
    //         elemIndex.insert(deweyID.getCID(),deweyID);
    //         bTreeIndex.insert(deweyID,deweyID.getCID(),qName);
    if (!qNameFound) {
      // structSumIndex.add(deweyID.getCID(),qName,parentCID);
      try {
        if (con != null) {
          String sqlQuery = "INSERT INTO \"OrderedByCID\" (\"CID\", \"DeweyID\") VALUES (?, ?);";
          PreparedStatement pst = con.prepareStatement(sqlQuery);
          pst.setInt(1, deweyID.getCID());
          pst.setString(2, deweyID.toString());
          //                    pst.setString(3, String.v);
          pst.executeUpdate();
          pst.close();
        }
      } catch (SQLException e) {
        System.out.println("JDBC Driver is not Configured Correctly !");
        e.printStackTrace();
        return;
      }
    }
    // checkBufPool();
  }

  public void addValue(DeweyID deweyID, String value, int parentCID) throws IOException, Exception {
    // we may have problem here
    // maybe we should update previously inserted attributes instead of insert new one

    // FOR ATTrib Values (Actually they are behaved the same as text contents)
    // text contents are not added to element index,thier CID shouldn be Zero
    // elemIndex.insert(0,deweyID);
    // bTreeIndex.insert(deweyID,-1,value);
    logManager.LogManager.log(6, value);
    logManager.LogManager.log(6, "Value: " + deweyID.toString());
    try {
      if (con != null) {
        String sqlQuery =
            "INSERT INTO \"OrderedByCID\" (\"CID\", \"DeweyID\" , \"Value\") VALUES (?, ? ,?);";
        PreparedStatement pst = con.prepareStatement(sqlQuery);
        pst.setInt(1, deweyID.getCID());
        pst.setString(2, deweyID.toString());
        pst.setString(3, value);
        pst.executeUpdate();
        pst.close();
      }
    } catch (SQLException e) {
      System.out.println("JDBC Driver is not Configured Correctly !");
      e.printStackTrace();
      return;
    }

    // structSumIndex.add(-1,value,parentCID);THIS IS NOT NEEDED!
    // checkBufPool();
  }

  public void addContent(DeweyID deweyID, StringBuilder contentBuilder, int parentCID)
      throws IOException, Exception {
    String content = new String(contentBuilder);
    try {
      if (con != null) {
        String sqlQuery =
            "INSERT INTO \"OrderedByCID\" (\"CID\", \"DeweyID\" , \"Value\") VALUES (?, ? ,?);";
        PreparedStatement pst = con.prepareStatement(sqlQuery);
        pst.setInt(1, deweyID.getCID());
        pst.setString(2, deweyID.toString());
        pst.setString(3, content);
        pst.executeUpdate();
        pst.close();
      }
    } catch (SQLException e) {
      System.out.println("JDBC Driver is not Configured Correctly !");
      e.printStackTrace();
      return;
    }
    // text contents are not added to element index,thier CID shouldn be Zero
    // elemIndex.insert(0,deweyID);
    //         bTreeIndex.insert(deweyID,-2,content);
    //         System.out.println("CID: -2");
    // structSumIndex.add(-2,content,parentCID);THIS IS NOT NEEDED
    // checkBufPool();
  }

  public void endOfDocSignal() throws IOException, DBException, SQLException {
    structSumIndex.endDoc();
    //         docMgr.closeDoc(this.docName);
    con.close();
  }
}
 public void endDoc() throws IOException {
   bufMngr.unpinBuffer(xBufferChannel, true);
 }
  public void add(int CID, String qName, int parentCID) throws IOException, DBException {
    boolean keyFound = false;
    byte[] qNameArray;
    int qLength;
    // we need this in case that keys being added exceed page size:
    // storage format in ssIndex: cid(int),qlen(int),qSeq(byte array),parentCId(int)

    qNameArray = qName.getBytes();
    qLength = qNameArray.length; // qname only
    xBufferChannel.position(freeOffset); // Every Iteration it must be set.
    int capacity = Settings.pageSize - freeOffset;
    int reqSpace = qLength + 3 * Settings.sizeOfInt;
    if (reqSpace <= capacity) {

      xBufferChannel.putInt(CID); // CID
      //            logManager.LogManager.log(0,"QNAME: "+ qName);
      //            logManager.LogManager.log(0,"Position: "+ xBufferChannel.position());
      xBufferChannel.putInt(qLength);
      xBufferChannel.put(qNameArray, 0, qLength);
      xBufferChannel.putInt(parentCID); // parentCId
      numOfKeys++;
      freeOffset += (qLength + 3 * Settings.sizeOfInt);
    } else {

      // must add page
      // twinNode=new BTreeNode(indexName,(byte)0,(byte)1, -1);//numOfKeys is not valid yet
      XBufferChannel hlpr = bufMngr.getFreePage();
      workingPage = hlpr.getPageNumber();
      logManager.LogManager.log(5, "Structural Sum P: " + workingPage);
      // numOfKeys=keysAdded;
      // unTakenRecs=numOfKeys;maybe we need this in the future
      xBufferChannel.position(Settings.nextPagePos);
      xBufferChannel.putInt(workingPage);
      //            if(workingPage==19995)
      //                logManager.LogManager.log(5, "nextPage:19915"+"workingPage:
      // "+xBufferChannel.getPageNumber());
      xBufferChannel.position(Settings.freeOffsetPos); // not needed
      xBufferChannel.putInt(freeOffset);
      // if(freeOffset==511)
      //            logManager.LogManager.log(5,"freeOffset: "+ freeOffset);
      xBufferChannel.position(Settings.numOfKeysPos);
      xBufferChannel.putInt(numOfKeys);
      // if(numOfKeys==26)
      //            logManager.LogManager.log(5,"numOfKeys: "+ numOfKeys);
      bufMngr.unpinBuffer(xBufferChannel, true);
      changeWorkingPageTo(hlpr);
      // write remaining record:
      xBufferChannel.putInt(CID); // CID
      xBufferChannel.putInt(qLength);
      xBufferChannel.put(qNameArray, 0, qLength);
      xBufferChannel.putInt(parentCID); // parentCId
      numOfKeys++;
      freeOffset += (qLength + 3 * Settings.sizeOfInt);
    }
    // unTakenRecs=numOfKeys;maybe we need this in the future
    // here nexP should be -1 cause there is no page after!
    xBufferChannel.position(Settings.freeOffsetPos);
    xBufferChannel.putInt(freeOffset);
    xBufferChannel.position(Settings.numOfKeysPos);
    xBufferChannel.putInt(numOfKeys);
    /// bufMngr.unpinBuffer(xBufferChannel, true);

  }
 public BufferManager getBufferManager() {
   return BufferManager.getInstance();
 }