[原]代码管理工具WeCode及其数据导出

news/2024/11/16 22:19:52/文章来源:https://www.cnblogs.com/wintys/p/4592583.html

1.WeCode简介

    SVN、Git等工具适合多人协作时代码管理。类似在线的Gist(http://gist.github.com),WeCode是适合个人离线代码片段管理。

    wecode是CodeHelp的升级版本,是专门为我们程序员设计的一款源代码管理软件。 它能方便的管理您在编程和学习中有用的源代码,减少经常到处查找资料的劳动,节省您在开发中的时间和精力。
    知识管理越来越被大家所重视,源代码也应该做为一种知识资源,纳入知识管理体系中去。 利用wecode,可以方便的管理你的各种技术资料和源代码。 

    CodeHelp: http://blog.csdn.net/thinkry/article/details/248463

    WeCode: http://wecode.thinkry.com/

   

2. WeCode导出

     CodeHelp、WeCode作者都是thinkry。我只是写了个导出的Java程序。无论用什么工具,内容可以方便地迁移才是最重要的。之前写了一个CodeHelp导出(导出CodeHelp的数据 : http://www.blogjava.net/wintys/archive/2009/03/16/java_codehelpexporter.html)。现在CodeHelp升级成了WeCode,但是表结构并没有变化,试了一下之前的导出代码在JDK8.0下运行不了,因为sun.jdbc.odbc.JdbcOdbcDriver类被JDK移除了。所以改进了一下,代码如下:

 

 

import java.sql.*;

 

import java.io.*;
import java.util.*;
public class WeCodeExporterMain{
    public static void main(String[] args){
        String dbq = "D:/helpdb.mdb";
        WeCodeExporter exporter = new WeCodeExporter( dbq );
        exporter.export();
    }
}
/*
 *将WeCode数据库中的文件导出
 *@version 2015-06-21
 *@author wintys@gmail.com
 */ 
class WeCodeExporter{
    Database db;//数据库连接对象
    public WeCodeExporter(String dbPath){
        db = new Database(dbPath);
        try{
            db.connect();
        }catch(SQLException sqle){
            sqle.printStackTrace();
        }
    }
    /**
     *按WeCode的目录结构导出文章及其附件。
     *但有一点不同,就是不含任何内容的目录不会被创建。
     *文章会被导出到当前目录的ExportedFiles目录下。
     */
    public void export(){
        try{
            String sql;
            sql = "SELECT T.NodeId AS id , T.ParentId AS parent ,";
            sql +="T.Type AS type,T.Title AS title , C.Content AS content ";
            sql +="FROM TContent C, TTree T WHERE T.NodeId = C.NodeId ";
            ResultSet rs = db.query(sql);
            while(rs.next()){
                int type = rs.getInt("type");
                if(type == 0)//如果是目录,则无操作
                    continue;
                int parent = rs.getInt("parent");
                int id = rs.getInt("id");
                String title = rs.getString("title");
                File fullParentPath = null;
                fullParentPath = parentPath(parent , ""); 
                fullParentPath = new File("ExportedFiles/" + 
                                                        fullParentPath.toString() );
                
                //读取附件的SQL
                String sql2 = "SELECT A.Title AS title , A.Data AS data ";
                sql2 += "FROM TAttachment A WHERE A.NodeId = " + id;
                ResultSet rs2=db.query(sql2);
                //判断文章有没有附件
                //如果文章没有附件则不创建目录,即文章不包含在目录中
                rs2.last();
                int num = rs2.getRow();
                String article;
                if(num > 0){
                    article = title + "/" ;
                }
                else{
                    article = "";
                }
                fullParentPath = new File(fullParentPath , article);
                if(!fullParentPath.exists())
                    fullParentPath.mkdirs();
                    
                //读取文章
                InputStream input = rs.getAsciiStream("content");
                readDataToFile(new File(fullParentPath ,  title + ".txt") , input);
                //读取文章的附件
                rs2.beforeFirst();
                while(rs2.next()){
                    String attachmentName = rs2.getString("title");
                    InputStream data = rs2.getBinaryStream("Data");
                    //将附件与其文章一同放在以文章名为目录名的目录中
                    readDataToFile(new File(fullParentPath , attachmentName) , 
                                            data);
                }
                rs2.close();
            }
            rs.close();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                db.close(); 
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    /**
     *从数据流中读取数据到文件
     *@param fileName 输出文件的文件名
     *@param input 数据输入流
     */
    private void readDataToFile(File filePath , InputStream input)
        throws IOException{
        FileOutputStream file = new FileOutputStream(filePath);
        BufferedOutputStream output = new BufferedOutputStream(file);
        byte[] buf = new byte[1024];
        int len;
        while((len = input.read(buf))!=-1){
            output.write(buf , 0 , len);
        }
        input.close();
        output.close();
    }
    /**
     *递归地构造目录(如果父目录存在的话)。即如果是子目录,则一直找到根目录才返回。
     *@param parent 父目录的ParentId
     *@param title 文件自身目录名,对于文章而言,path总是传入空字符串。
     *@return 返回构造后的目录(含从根目录一直到子目录的各级目录)
     */
    private File parentPath(int parent , String path) 
        throws IOException , SQLException{
       
        if(parent == 0){//根目录
            File dir = new File(path);
            return dir;
        }else{
            String sql = "SELECT Title , ParentId  FROM TTree ";
            sql += "WHERE NodeId=" + parent;
            ResultSet rs = db.query(sql);
            
            if(rs.next()){
                String nodeTitle = rs.getString("Title");
                int nodeParent = rs.getInt("ParentId");
                path = nodeTitle + "/" + path;
                return parentPath(nodeParent , path);
            }
            rs.close();
        }
        return null;///
    }
}
/**
 *数据库操作类,当前只适用于Access数据库。
 *@version 2015-06-21
 *@author wintys@gmail.com
 */
class Database{
    private Connection conn = null;
    private String dbPath = null;
    /**
     *构造方法
     *@param databasePath Access数据库的路径
     */
    public Database(String databasePath){
        dbPath = databasePath;
    }
    /**
     *连接数据库
     *@return 返回一个数据库连接Connection,如果连接数据库失败,返回null。
     */
    public Connection connect()
        throws SQLException{
        if(conn!=null)
            return conn;
        
        if(dbPath==null || dbPath.equals("")){
            conn = null;
            throw new SQLException("数据库路径错误!");
        }
        //Microsoft Access数据库连接字符串
        String url = "jdbc:Access:///"+  dbPath;
        try{
            Class.forName("com.hxtt.sql.access.AccessDriver");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
Properties prop = new Properties();     
prop.put("charSet", "gb2312");  //设置编码防止中文出现乱码 
conn = DriverManager.getConnection(url , prop);
        
        return conn;
    }
    /**
     *关闭数据库连接
     */
    public void close() throws SQLException{
        if(conn!=null)
            conn.close();
    }
    /**
     *执行查询,调用者要负责关闭结果集。
     *@param sql 要执行的SQL查询语句
     *@return 返回查询结果集
     */
    public ResultSet query(String sql) throws SQLException{
        Statement stmt;
        stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE , 
                                                      ResultSet.CONCUR_UPDATABLE);
        ResultSet rs = stmt.executeQuery(sql);
        return rs;
    }
}
附件1:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/708985.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go高并发之路——go语言如何解决并发问题

一、选择GO的原因 作为一个后端开发,日常工作中接触最多的两门语言就是PHP和GO了。无可否认,PHP确实是最好的语言(手动狗头哈哈),写起来真的很舒爽,没有任何心智负担,字符串和整型压根就不用区分,开发速度真的是比GO快很多。现在工作中也还是有一些老项目在使用PHP,但…

线程安全使用 HashMap 的四种技巧

这篇文章,我们聊聊线程安全使用 HashMap 的四种技巧。1方法内部:每个线程使用单独的 HashMap 如下图,tomcat 接收到到请求后,依次调用控制器 Controller、服务层 Service 、数据库访问层的相关方法。 每次访问服务层方法 serviceMethod 时,都会在方法体内部创建一个单独的…

C - AtCoder Magics

C - AtCoder Magics https://atcoder.jp/contests/abc354/tasks/abc354_c思路 首先按照a属性对数列进行排序,大的在前,小的在后, 完成后, 则数列在a参数上是非递增的。 如下图中x轴对应 a 参数, y轴对应c参数, discard条件,实际上是找出 数列 对于c参数 沿着 a 参数非递…

『手撕Vue-CLI』添加自定义指令

前言 经上篇『手撕Vue-CLI』添加帮助和版本号的介绍之后,已经可以在控制台中输入 nue --help 来查看帮助信息了,但是在帮助信息中只有 --version,--help 这两个指令,而 vue-cli 中还有很多指令,例如 create,serve,build 等等,所以本章将继续添加自定义指令,例如 creat…

Web入门

SQL注入 数据库基础 *关系型数据库: #Access#MSSQL -- 1433*非关系型数据库: #MySQL -- 3306#Oracle -- 1521等对MySQL数据库的操作 1.显示数据库 show databases;2.显示数据库版本 select version(); 3.使用数据库 use XXX;4.显示当前正在使用的数据库 selec…

Linux常用命令-文件目录命令

Linux常用命令-文件目录命令1.目录命令 1.1、ls命令:显示目录下的内容 基本格式 [root@localhost ~]# ls [选项] [参数是文件名或目录名]常用选项 -a:显示所有文件。 --color=when。支持颜色输出,when的值默认是always(总显示颜色),never(不显示颜色)和auto(自动)。 -d:显…

asdf

asf本文版权归作者和博客园共有,欢迎转载,转载请注明原文链接:https://www.cnblogs.com/lllliuxiaoxia/p/18200863另外欢迎关注公众号,一起讨论学习

啊手动阀手动阀

阿斯顿发射点发射点发生发射点发撒打发本文来自博客园,作者:胖树,转载请注明原文链接:https://www.cnblogs.com/lllliuxiaoxia/p/18200857关注我的公众号不定期推送资讯

配置SQLServer远程连接

要在 SQL Server 上启用远程连接,需要执行以下步骤:1、确保 SQL Server 已启用远程连接:  登录到 SQL Server 所在的计算机上。  打开 SQL Server Management Studio (SSMS)。  使用 Windows 身份验证或 SQL Server 身份验证登录 SQL Server。  在左侧的对象资源管理…

uCTRL论文阅读笔记

uCTRL: Unbiased Contrastive Representation Learning via Alignment and Uniformity for Collaborative Filtering论文阅读笔记 这篇文章应该是关于无偏推荐的 Abstract ​ 由于协作过滤(CF)模型的隐式用户反馈偏向于流行的项目,CF模型倾向于产生带有流行偏差的推荐列表。…

SQL Server 2012提供了多种备份和还原数据库的方法,包括以下几种:

SQL Server 2012提供了多种备份和还原数据库的方法,包括以下几种:SQL Server Management Studio(SSMS):SSMS是一个支持图形用户界面的工具,可以通过它备份和还原整个数据库或特定的数据表、视图等。在SSMS中,可以通过右键单击数据库并选择“任务” > “备份”或“还原…