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

📄 databaseserver.java

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

package org.wuhua.fuck;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.microedition.rms.InvalidRecordIDException;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreFullException;
import javax.microedition.rms.RecordStoreNotFoundException;
import javax.microedition.rms.RecordStoreNotOpenException;

import org.wuhua.fuck.core.DataCore;
import org.wuhua.fuck.core.MetaData;
import org.wuhua.fuck.core.RmsAccessException;
import org.wuhua.fuck.core.SQLError;
import org.wuhua.fuck.core.SQLException;



/**
 * <b>类名:DataBaseServer.java</b> </br> 
 * 编写日期: 2007-2-7 <br/>
 * 程序功能描述:数据的服务对象,启动数据库服务 <br/>
 * Demo: <br/>
 * Bug: <br/>
 * 
 * 程序变更日期 :<br/> 
 * 变更作者 :<br/> 
 * 变更说明 :<br/>
 * 
 * @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a>
 */
public final class DataBaseServer {
	
	private static Logger logger = Logger.getLogger("DataBaseServer");
	
	public final static String DATAMETA = "matameta";
	static RecordStore datameta = null;
	
	/**
	 * 存储元数据资源
	 */
	static Hashtable hashmeta;
		
	/**
	 * 存储表格资源
	 * 每个表对于一个表名,
	 * 对于索引于元数据表,则第一个插入到这个table中
	 */
	static Hashtable table;
	
	/**
	 * 初始化资源
	 */
	static{
		hashmeta = new Hashtable();
		table = new Hashtable();
	}
	
	/**
	 * 启动服务,并变量matameta表,
	 * 获取元数据,并获取对于表的字段索引
	 *
	 */
	public final static  void start() throws RmsAccessException{
		datameta = createTable(DATAMETA);
		table.put(DATAMETA, datameta);
		
		loadMetaData();
	}
	
	/**
	 * 重新启动
	 */
	public final static void restart()throws RmsAccessException{
		loadMetaData();
	}
	
	/**
	 * 把数据表放入缓存
	 * @param key
	 * @param rs
	 */
	public final static void putTableToHashtable(String key, RecordStore rs ){
		table.put(key, rs);	
	}
	
	
	/**
	 * 把数据表放入缓存
	 * @param key
	 * @param rs
	 */
	public final static void removeTableFormHashtable(String key){
		table.remove(key);
	}
	
	/**
	 * 载入元数据,因为数据保存的是byte格式,所以
	 * 我现在对于的是每个记录的格式是 tableName :column1,coulu2:indexName(colummName):key,keyIndex :key,keyIndex
	 * @throws RecordStoreNotOpenException 
	 *
	 */
	public  static  void   loadMetaData() {
		logger.debug("启动数据库,并载入元数据跟索引");
		int num=0;
		try {
			num = datameta.getNumRecords();
			logger.debug(num);
		} catch (RecordStoreNotOpenException e1) {		 
			e1.printStackTrace();
		}
		
		byte [] bytes = null;
		for(int i=1; i <= num; i++){	
			try {
				bytes = datameta.getRecord(i);
				putMetaToHashtable(bytes);
			} catch (InvalidRecordIDException e) {
				e.printStackTrace();
			} catch (RecordStoreException e) {			 
				e.printStackTrace();
			}
		}
		logger.debug("启动数据库成功,载入元数据成功!");
		
	}
	
	public static final void modifyDataFromId(String tableName, int id, byte[] values) throws SQLException{
		try {
			findTable(tableName).setRecord(id, values, 0, values.length);
			logger.debug("更新 " + tableName + " id " + id + " 成功" + new String(values));
		} catch (RecordStoreNotOpenException e) {
			e.printStackTrace();
		} catch (InvalidRecordIDException e) {			
			e.printStackTrace();
			throw SQLError.createSQLException("数据ID : " + id + " is not exists!", "Sql State : " + SQLError.SQL_STATE_BASE_TABLE_NOT_FOUND);
		} catch (RecordStoreFullException e) {
			 
			e.printStackTrace();
		} catch (RecordStoreException e) {
			 
			e.printStackTrace();
		} 
	}
	/**
	 * 删除指定id的数据
	 * @param name
	 * @param id
	 * @throws SQLException
	 */
	public static final void deleteDataFromForId(String tableName, int id) throws SQLException{
		try {
			findTable(tableName).deleteRecord(id);
			logger.debug("从 " + tableName + " 删除 " + id + " 成功 ");
		} catch (RecordStoreNotOpenException e) {
			 
			e.printStackTrace();
		} catch (InvalidRecordIDException e) {
			throw SQLError.createSQLException("数据ID : " + id + " is not exists!", "Sql State : " + SQLError.SQL_STATE_BASE_TABLE_NOT_FOUND);
		} catch (RecordStoreException e) {
			
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 查找数据从key, value对应的数据集
	 * 查找的原则是:
	 * 数据保存格式是:data1!:?data2:....
	 * 从metadata数据中查询是否存在这个关键字,如果不存在则抛出异常
	 * 找到关键字的时候,查询这个关键字在表中的位置索引
	 * 如果发现这个索引大于这个表所有字段之和抛出异常
	 * @param name
	 * @param key
	 * @param value
	 * @return -- 返回一个hashtable ,里面的结构是1 -- hashtable(row),2, 
	 * @throws SQLException
	 */
	public static final Hashtable findDataFromTableToHashtable(String name, String key, String value) throws SQLException{
		logger.debug("Load Data From Table " + name );
		MetaData meta = findTableMetadataByName(name);
		RecordStore table = findTable(name);//查找数据库
		
		if(meta == null){
			throw SQLError.createSQLException("Table : " + name + " metadata not exists not find!", "Sql State : " + SQLError.SQL_STATE_BASE_TABLE_METADATA_NOT_FOUND); 
		}
		
		if(table == null){
			throw SQLError.createSQLException("Table : " + name + " not exists!", "Sql State : " + SQLError.SQL_STATE_BASE_TABLE_NOT_FOUND); 
		}
		
		
		if(key == null 
				&& value == null){
			return listAll( meta,   table);
		}else{
			if(meta.getColumn().get(key) == null){
				throw SQLError.createSQLException("Column : " + key + " not find!", "Sql State : " + SQLError.SQL_STATE_COLUMN_NOT_FIND); 
			}
			
			return findDataImpl(key, value, meta, table);
		}
	 
	}

	/**
	 * 获取所以数据
	 * @param meta
	 * @param table2
	 * @return
	 */
	private static Hashtable listAll(MetaData meta, RecordStore table)  throws SQLException {
		 
		java.util.Enumeration em = meta.getColumn().elements();
		String[] ma = new String[meta.getColumn().size()];
		int size=0;
		while(em.hasMoreElements()){
			String s = (String) em.nextElement();
			ma[size]=s;
			//logger.debug("KEY:" + s);
			//logger.debug("key:" + key);
			 
			size++;	
		}

		int num=0;
		try {
			num = table.getNumRecords();
		} catch (RecordStoreNotOpenException e) {
			
		}
	
		Hashtable data = new Hashtable();
		
		int dataIndex=0;
		for(int i=1; i <= num; i++){	
			try {
			 
				String datastring = read(table, i);
				
;				String[] ms = StringUtil.split(datastring, DataCore.SQIL);
				 
			//	logger.debug("DataString: " + datastring);
				//logger.debug(ms[keyIndex] + "=" + value);
				 
					
					logger.debug("DataString: " + datastring);
					Hashtable row = new Hashtable();
					
					//一个非常重要的索引,就是对于RMS的ID
					row.put(DataCore.ROW_INDEX, new Integer(i).toString());
					for(int j=0; j<ms.length; j++){
						row.put(ma[j], ms[j]);
					}
					data.put(new Integer(dataIndex), row);
					dataIndex++;

⌨️ 快捷键说明

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