/* * Categorylinks.java * * Read more about categories in wikipedia: * http://meta.wikimedia.org/wiki/Help_talk:Category * * Copyright (c) 2005-2007 Andrew Krizhanovsky /aka at mail.iias.spb.su/ * Distributed under GNU Public License. */ package wikokit.base.wikipedia.sql; import wikokit.base.wikipedia.util.StringUtil; import wikokit.base.wikipedia.language.Encodings; import java.sql.*; import java.util.*; public class Categorylinks { //public int cl_from; // stores the cur_id of the article where the link was placed //public String cl_to; // stores the name (excluding namespace prefix) of the desired category // public String cl_sortkey; // stores the title by which the page should be sorted in a cateogy list (ORDER BY cl_sortkey) // public int cl_timestamp; // cl_timestamp marks when the link was last added private final static String[] NULL_STRING_ARRAY = new String[0]; /** Count the total number of categories in the database. * @return -1 if database is not available */ public static int countCategoryLinks(Connect connect) { Statement s = null; ResultSet rs= null; int size = 0; String str_sql = null; if(null==connect || null==connect.conn) return -1; try { s = connect.conn.createStatement (); str_sql = "SELECT COUNT(*) AS size FROM categorylinks"; rs = s.executeQuery (str_sql); if (rs.next ()) { size = rs.getInt("size"); } } catch(SQLException ex) { System.out.println("SQLException (Categorylinks.java countCategoryLinks()):: sql='" + str_sql + "' " + ex.getMessage()); } finally { if (rs != null) { try { rs.close(); } catch (SQLException sqlEx) { } rs = null; } if (s != null) { try { s.close(); } catch (SQLException sqlEx) { } s = null; } } return size; } /** Gets ID of articles which have the category titled 'category_title'. * SQL: * SELECT cl_from FROM categorylinks WHERE cl_to="Folklore"; */ public static List<Integer> getArticlesIDSubcategoryIDByCategoryTitle( Connect connect, String category_title) { if(null==connect || null==connect.conn) return null; List<Integer> id = new ArrayList<Integer>(); Statement s = null; ResultSet rs= null; sb.setLength(0); try { s = connect.conn.createStatement (); sb.append("SELECT cl_from FROM categorylinks WHERE cl_to=\""); String safe_title = StringUtil.spaceToUnderscore( StringUtil.escapeChars(category_title)); safe_title = connect.enc.EncodeToDB(safe_title); sb.append(safe_title); sb.append("\""); rs = s.executeQuery (sb.toString()); while (rs.next ()) { id.add( rs.getInt("cl_from") ); } } catch(SQLException ex) { System.out.println("SQLException (Categorylinks.java getArticlesIDSubcategoryIDByCategoryTitle()):: sql='" + sb.toString() + "' " + ex.getMessage()); } finally { if (rs != null) { try { rs.close(); } catch (SQLException sqlEx) { } rs = null; } if (s != null) { try { s.close(); } catch (SQLException sqlEx) { } s = null; } } return id; } private static StringBuffer sb = new StringBuffer(75); //static int max_len_sql = 0; /** Get categories' names of the article by article ID. * @param cl_from article id (cur_id) * Remark: * 1) use in SQL: String str_utf8 = Encodings.FromTo(str_latin1, "ISO8859_1", "UTF8"); * 2) use in output String str_latin1 = Encodings.FromTo(str_utf8, "UTF8", "ISO8859_1"); */ public static String[] GetCategoryTitleByArticleID(Connect connect, int cl_from) { // old title: GetCategory String[] categories = null; Statement s = null; ResultSet rs= null; int size, i; if(null==connect || null==connect.conn) return NULL_STRING_ARRAY; sb.setLength(0); try { s = connect.conn.createStatement (); //str_sql = "SELECT COUNT(cl_to) AS size FROM categorylinks WHERE cl_from=" + cl_from; sb.append("SELECT COUNT(cl_to) AS size FROM categorylinks WHERE cl_from="); sb.append(cl_from); /*if(max_len_sql < str_sql.length()) { max_len_sql = str_sql.length(); System.out.println("GetCategory max_len_sql="+max_len_sql); }*/ rs = s.executeQuery (sb.toString()); if (rs.next ()) { size = rs.getInt("size"); if (0 < size) { categories = new String[size]; // "SELECT cl_to FROM categorylinks WHERE cl_from=" + cl_from sb.setLength(0); sb.append("SELECT cl_to FROM categorylinks WHERE cl_from="); sb.append(cl_from); rs = s.executeQuery ("SELECT cl_to FROM categorylinks WHERE cl_from=" + cl_from); i=0; while (rs.next ()) { byte[] b = rs.getBytes("cl_to"); categories[i++] = Encodings.bytesTo(b, "UTF8"); // ISO8859_1 } } } } catch(SQLException ex) { System.out.println("SQLException (Categorylinks.java GetCategory()):: sql='" + sb.toString() + "' " + ex.getMessage()); } finally { if (rs != null) { try { rs.close(); } catch (SQLException sqlEx) { } rs = null; } if (s != null) { try { s.close(); } catch (SQLException sqlEx) { } s = null; } } return categories; } /** Gets first level of categories for the page with page_id. */ /*public static List<Integer> getFirstLevel (Connect connect, int page_id) { //ids is a first level categories List<Integer> ids = new ArrayList<Integer>(); String[] add = GetCategory(connect, page_id); for(String a : add) { int id = PageTable.getCategoryIDByTitle(connect, a); if (0 == id) continue; ids.add(id); } return ids; }*/ }