⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datasqlparser.java

📁 用自己写的j2me rms引擎写的电话本 功能是: 1.添加 2.查询 3.列出所有的资料 1.修改 2.删除 3.排序
💻 JAVA
字号:

package org.wuhua.fuck.core.impl;

import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;

import org.wuhua.fuck.DataBaseServer;
import org.wuhua.fuck.Logger;
import org.wuhua.fuck.core.DataCore;
import org.wuhua.fuck.core.ResultSet;
import org.wuhua.fuck.core.RmsAccessException;
import org.wuhua.fuck.core.SQLError;
import org.wuhua.fuck.core.SQLException;

/**
 * <b>类名:DataSQLParser.java</b> </br> 
 * 编写日期: 2007-2-12 <br/>
 * 程序功能描述:提供对inser, update, delete, select的支持 <br/>
 * 对表格的创建,删除,暂时不提供修改的功能。 <br/>
 * 这个是小型数据操作的引擎.<br/>
 * Demo: <br/>
 * Bug: <br/>
 * 
 * 程序变更日期 :<br/> 
 * 变更作者 :<br/> 
 * 变更说明 :<br/>
 * 
 * @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a>
 */
  class DataSQLParser extends BaseSQLParser{
	private static Logger logger = Logger.getLogger("DataSQLParser");
	
	Hashtable column;

	DataSQLParser(String sql) throws SQLException {
		super(sql);
		//column = DataBaseServer.findTableMetadataByName(sqls[1]).getColumn(); 
	}

	public ResultSet parser() throws SQLException {	 
		String name = sqls[0];
		if(name.equals("create")){
			crateTable();
		}else if(name.equals("drop")){
			dropTable();		
		}else if(name.equals("insert")){
			insert();
		}else if(name.equals("delete")){
			delete();			
		}else if(name.equals("update")){
			update();
		}else if(name.equals("select")){
			return select();
		}else{
			throw SQLError.createSQLException("SQL syntax error!", "Sql State : " + SQLError.SQL_STATE_SYNTAX_ERROR);
		}
		return new ResultSetBaseImpl(null);
	}
	
	/**
	 * 更新表数据
	 *
	 */
	private void update() throws SQLException {
		if(DataBaseServer.findTableMetadataByName(sqls[1]) == null
				|| parameter == null ){
			throw SQLError.createSQLException("Table : "+ sqls[1] + " Column is larger or smaller than metadata large!", "Sql State : " + SQLError.SQL_STATE_OHTER);
		}
	 
		
		column = DataBaseServer.findTableMetadataByName(sqls[1]).getColumn(); 
		StringBuffer values = new StringBuffer();
		Enumeration em = column.elements();
		String[] paraName = new String[column.size()];
		int i = 0;
		
		while(em.hasMoreElements()){		
			paraName[i] = (String) em.nextElement() ;
			i++;
		}
		 
		
		
		
		//查询。并从查询的数据中发现那些数据,并更新
		ResultSet rs = this.select();
		while(rs.next()){
			int id = Integer.parseInt(rs.getString(DataCore.ROW_INDEX));
			try {
				for(int j=0; j<paraName.length; j++){
					if(parameter.get(paraName[j]) != null){
						values.append(parameter.get(paraName[j]));
					}else{
						values.append(rs.getString((paraName[j])));
					}
					values.append(DataCore.SQIL);
				}
				logger.debug("更新的数据是: "  + values);
				DataBaseServer.modifyDataFromId(sqls[1], id, DataBaseServer.getBytes(values.toString()));
			 
			} catch (IOException e) {
				 
				e.printStackTrace();
			}
		}
	}

	/**
	 * 查询数据,暂时不支持多字段查询
	 * select name column wuhua;
	 * @throws SQLException 
	 *
	 */
	private ResultSet select() throws SQLException {
//		logger.debug( sqls[1] + " : " + sqls[2] + " : " + sqls[3] );  
		
		if(sqls.length == 2)
			return new ResultSetBaseImpl(DataBaseServer.findDataFromTableToHashtable( sqls[1] ,  null ,  null ));
		else
			return new ResultSetBaseImpl(DataBaseServer.findDataFromTableToHashtable( sqls[1] ,  sqls[2] ,  sqls[3] ));
	}

	/**
	 * 删除所有数据的原则是,先删除表格,再创建一个新的表格
	 * @throws SQLException 
	 *
	 */
	private void delete() throws SQLException {
		if(sqls.length == 2){
			dropTable(); //
			crateTable();
		}else{
			deleteWhereId();
		}
		
	}

	private void deleteWhereId() throws SQLException {
		 ResultSet rs = this.select();
		 while(rs.next()){
			 DataBaseServer.deleteDataFromForId(sqls[1], Integer.parseInt(rs.getString(DataCore.ROW_INDEX)));
		 }
		
	}

	/**
	 * 插入数据语法
	 * insert tablename column1 ... ....
	 *  保存数据的格式是
	 * 然后调用
	 * @see 
	 * @throws SQLException
	 */
	private void insert() throws SQLException{
		logger.debug(parameter);	
		if(parameter == null || 
				parameter.size() != (sqls.length-2)){
			throw SQLError.createSQLException("Table : "+ sqls[1] + " Column is larger or smaller than metadata large!", "Sql State : " + SQLError.SQL_STATE_OHTER);
		}
		
		
		StringBuffer values = getContentFromParameter();
		logger.debug("Insert  " + sqls[1] + " values " + values.toString() );
		try {
			DataBaseServer.store(sqls[1], DataBaseServer.getBytes(values.toString()));
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}

	private StringBuffer getContentFromParameter() {
		column = DataBaseServer.findTableMetadataByName(sqls[1]).getColumn(); 
		StringBuffer values = new StringBuffer();
		Enumeration em = column.elements();
		while(em.hasMoreElements()){
			String value = (String) parameter.get(em.nextElement());
			values.append(value);
			values.append(DataCore.SQIL);
		}
		return values;
	}
	
	private void dropTable() throws SQLException {
		DataBaseServer.closeTable(sqls[1]);
		DataBaseServer.removeTableFormHashtable(sqls[1]); 
		DataBaseServer.delete(sqls[1]);
		 
	}

	//创建表格的具体实现
	private void crateTable() throws SQLException {
		logger.debug("create table \"" + sqls[1] + "\"");
		StringBuffer sb = new StringBuffer();
		sb.append(sqls[1] + ":");
		for(int i = 2; i < sqls.length; i++){
			sb.append(sqls[i] + "," );
		}
		
		createTebaleImpl();		
		inserMetaData(sb);
		
		restartDataServer();
		
	}

	/**
	 * 增加一个表,应该重新启动服务,并载入元数据,也就是热启动
	 *
	 */
	private void restartDataServer() {
		try {
			DataBaseServer.restart();
		} catch (RmsAccessException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}
	}

	private void createTebaleImpl() throws SQLException {
		try {
			DataBaseServer.putTableToHashtable(sqls[1], DataBaseServer.createTable(sqls[1]));
		} catch (RmsAccessException e) {
			 
			throw  SQLError.createSQLException(e.getMessage(), "Sql State : " + SQLError.SQL_STATE_OHTER);
		}
	}

	private void inserMetaData(StringBuffer sb) throws SQLException {
		if(DataBaseServer.findTableMetadataByName(sqls[1]) != null)
			throw SQLError.createSQLException("Table : "+ sqls[1] + " exists!", "Sql State : " + SQLError.SQL_STATE_OHTER);
		logger.debug("Insert MetaData: " + sb.toString());
			try {
				DataBaseServer.store(DataBaseServer.DATAMETA, DataBaseServer.getBytes(sb.toString()));
			} catch (IOException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
			}
	}


	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -